Ver Mensaje Individual
  #15 (permalink)  
Antiguo 25/07/2012, 17:30
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: 17 años, 3 meses
Puntos: 2658
Respuesta: duda con consulta

Para entender esa consulta hay que comprender un sólo concepto: Producto Cartesiano
Como puedes ver en el link, genera una tabla donde cada valor de una tabla se combina con cada valor de la otra, en una multiplicación de conjuntos. Eso genera todas las combinaciones posibles entre ambas.
Luego viene el IN(). Esta cláusula verifica si un valor dado existe o no dentro de una lista de valores. Esa lista puede ser una lista separada por comas, o bien el resultado de una consulta.
El truco consiste en que debemos buscar un valor de clave que es doble (dos campos), por lo que para que tome el par combinado el valor a comparar debe ser encerrado entre paréntesis, y la subconsulta debe ser sobre los dos mismos campos, de la otra tabla.
El secreto principal es el que los campos en ambos casos deben estar en el mismo orden, o de lo contrario los resultados serán erróneos.
¿Se entiende?
Como la consulta mayor opera sobre un producto cartesiano, devolverá todas las combinatorias que pueden darse, al poner NOT IN, eliminará las que existen y devolverá el resto.
Atención: El producto cartesiano es la peor consulta que existe (un P.C. sobre dos tablas de 10.000 registros devolverían 100 millones, por ejemplo), y se debe usar si y sólo si es absolutamente necesario, como en este caso, y jamás con tablas grandes.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)