jueves, 5 de julio de 2007

INNER/OUTER JOINS (ANSI)

La pregunta del día es:
¿Usando la notación ANSI para joins, es lo mismo agregar condiciónes adicionales al where que en la cláusula ON?

Si no se entendió la pregunta, pongamos un ejemplo...

¿Son estas dos consultas equivalentes?
SELECT d.departamento_id, e.nombre
FROM (departamento d INNER JOIN empleado e
ON d.departamento_id = e.departamento_id)
WHERE d.seccion_id = e.seccion;

SELECT d.departamento_id, e.nombre
FROM (departamento d INNER JOIN empleado e
ON d.departamento_id = e.departamento_id
AND d.seccion_id = e.seccion);
Pensemos esto, si usáramos el viejo estilo de join (la sintaxis ANSI apareció en 9i), tendríamos todas las condiciones juntas, sin orden específico ni marca especial del tipo "esta condición es de join".
Sucede que luego que Oracle parsea la consulta, analiza todas las condiciones que haya encontrado y según lo que tiene sobre la mesa decide cuál aplicar primero. El hecho de que nosotros incluyamos una condición en el ON o en el where, no va a ser un factor decisivo sino una diferencia documental que aporta claridad. Hagamos sino la prueba de dejar una de las cláusulas de un join compuesto fuera del ON, y colocarla en el where.... el resultado va a ser el mismo!

Si alguien quiere pruebas experimentales concretas podrá comparar los planes de ejecución y notar que internamente es exactamente lo mismo.

No hay comentarios: