INNER JOIN con una condición compuesta

01/06/2005 - 12:22 por Rigel | Informe spam
Hola:

Hoy me he encontrado una consulta como esta:

SELECT * FROM Tabla1 INNER JOIN Tabla2 ON (Tabla1.C1=Tabla2.C3 AND
Tabla2.C1 IS NOT NULL)

Rapidamente (no sé si por costumbre o porqué) la he traducido a esta
otra:

SELECT * FROM Tabla1 INNER JOIN Tabla2 ON Tabla1.C1=Tabla2.C3
WHERE Tabla2.C1 IS NOT NULL

La sorpresa ha sido que las dos consultas no arrojan el mismo conjunto
de resultados.

La primera es como si "pasase" de Tabla2.C1 IS NOT NULL en el INNER
porque recupera tanto las filas en las que C1 es Nulo como las que
no...

Sin embargo, la segunda funciona bien, la de toda la vida.

¿Es ese el comportamiento de SQL Server? es decir, ignorar el resto de
una condición en una INNER JOIN y quedarse sólo con la primera
condición...

Lo he estado viendo con el plan de ejecución y efectivamente, "pasa"
de la segunda condición en la primera consulta (a mi no me importa,
pero es por si me encuentro algo similar en el futuro, traducirlo al
WHERE)

Gracias y un saludo.
 

Leer las respuestas

#1 Ricardo Passians
01/06/2005 - 14:07 | Informe spam
Mira.. en mi caso no he analizado bien ese tema particular pero yo tengo por
norma, siempre que sea posible, trasladar hacia el Where. las condiciones
que no son "de join". Me refiero a "condiciones de join" como aquellas que
estrictamente enlazan claves foraneas o de relaciones en general entre
tablas.
Las otras condiciones sobre pares (atributo,valor ) son las que dejo para el
Where. En ese caso yo habria codificado el query como la segunda opcion.
(con el where).



"Rigel" wrote in message
news:
Hola:

Hoy me he encontrado una consulta como esta:

SELECT * FROM Tabla1 INNER JOIN Tabla2 ON (Tabla1.C1=Tabla2.C3 AND
Tabla2.C1 IS NOT NULL)

Rapidamente (no sé si por costumbre o porqué) la he traducido a esta
otra:

SELECT * FROM Tabla1 INNER JOIN Tabla2 ON Tabla1.C1=Tabla2.C3
WHERE Tabla2.C1 IS NOT NULL

La sorpresa ha sido que las dos consultas no arrojan el mismo conjunto
de resultados.

La primera es como si "pasase" de Tabla2.C1 IS NOT NULL en el INNER
porque recupera tanto las filas en las que C1 es Nulo como las que
no...

Sin embargo, la segunda funciona bien, la de toda la vida.

¿Es ese el comportamiento de SQL Server? es decir, ignorar el resto de
una condición en una INNER JOIN y quedarse sólo con la primera
condición...

Lo he estado viendo con el plan de ejecución y efectivamente, "pasa"
de la segunda condición en la primera consulta (a mi no me importa,
pero es por si me encuentro algo similar en el futuro, traducirlo al
WHERE)

Gracias y un saludo.

Preguntas similares