Ver Mensaje Individual
  #2 (permalink)  
Antiguo 11/12/2007, 19:37
Avatar de gnzsoloyo
gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Re: interseccion en mysql

Teoría de conjuntos: Una intersección entre conjuntos A, B, C, ...n n, es un conjunto tal que sus miembros están incluidos en todos los conjuntos.
Eso significa simplemente que hay que determinar cuáles son las tuplas de una tabla A que están incluidas en la junta natural entre las tablas B y C.
Para poder cumplir con el requerimiento, las tablas A, B y C deben tener elementos en común. Esto se da cuando haces:

SELECT * FROM B INNER JOIN C USING (a, b, c) WHERE B.d = val1 AND C.e = val2 AND B.f = val3;

Siendo a, b y c campos pertenecientes a ambas tablas, con el mismo nombre en ambas y cuyos valores coinciden entre registros en una relación 1:1.
De esta relacción surge una tabla derivada que llamaremos D y que es la intersección entre B y C.
Si realizamos un nuevo INNER JOIN entre esta derivada y la tabla A, obtendremos la intersección entre ambas:

SELECT * FROM A INNER JOIN (SELECT * FROM B INNER JOIN C USING (a, b, c) WHERE B.d = val1 AND C.e = val2 AND B.f = val3) AS D USING(d, e, f);

o bien

SELECT * FROM A INNER JOIN (SELECT * FROM B INNER JOIN C USING (a, b, c) WHERE B.d = val1 AND C.e = val2 AND B.f = val3) AS D USING(a, b, c);

El resultado es en uno u otro caso, la intersección de las tres tablas.
Los dos ejemplos son para destacar que el conjunto de cojncidencia puede no ser el mismo entre las dos primarias que entre la derivada y la tercera. Lo único importante es que existan en la derivada Y en la A para que la consulta funcione.

Tener en cuenta:
- Usar USING, porque es más rápido que usar ON a = b.
- Un INNER JOIN es más rápido que INTERSECT, porque INTERSECT calcula cada una de las tres consultas y luego compara los resultados. INNER JOIN simplemente hace un matching entre valores descartando a medida que lee y devuelve solamente los que conciden entre las dos tablas, el resto ni los mira.
- Si se desea realizar un XOR, las cláusulas a usar son LEFT JOIN o RIGHT JOIN, donde los resultantes de una tabla sean nulos (NULL). En ese caso la consulta se complica.

Finalmente, no puedo usar tu ejemplo, porque las tres consultas son idénticas en todo ssus elementos y el conjunto devuelto por INTERSECT sería igual al de un sólo SELECT (los tres resultados concidirían en todas las tuplas).

Saludos.

Última edición por gnzsoloyo; 11/12/2007 a las 19:42