Efectivamente, WHERE
condiciones y JOIN
condiciones para [INNER] JOIN
son 100 % equivalentes en PostgreSQL. (Es una buena práctica usar JOIN
explícito condiciones para que las consultas sean más fáciles de leer y mantener).
Lo mismo es no verdadero para un LEFT JOIN
combinado con un WHERE
condición en una tabla a la derecha de la unión. El propósito de un LEFT JOIN
es conservar todas las filas en el lado izquierdo de la unión, independientemente de una coincidencia en el lado derecho. Si no se encuentra ninguna coincidencia, la fila se amplía con NULL
valores para las columnas del lado derecho. El manual:
LEFT OUTER JOIN
Primero, se realiza una unión interna. Luego, para cada fila en T1 que no satisface la condición de combinación con ninguna fila en T2, se agrega una fila combinada con valores nulos en las columnas de T2. Por lo tanto, la tabla unida siempre tiene al menos una fila para cada fila en T1.
Si luego aplica un WHERE
condición que requiere algo más que un NULL
valor en las columnas de las tablas en el lado derecho, anula el efecto y convierte a la fuerza el LEFT [OUTER] JOIN
para que funcione como un simple [INNER] JOIN
, solo (posiblemente) más caro debido a un plan de consulta más complicado.
En una consulta con muchas tablas unidas, Postgres (o cualquier RDBMS) tiene dificultades para encontrar el mejor (o incluso un buen) plan de consulta. El número de secuencias teóricamente posibles para unir tablas crece factorialmente (!). Postgres usa el "Optimizador de consultas genérico" para la tarea y hay algunas configuraciones para influir en él.
Ofuscar la consulta con LEFT JOIN
engañoso como se describe, dificulta el trabajo del planificador de consultas, es engañoso para los lectores humanos y, por lo general, sugiere errores en la lógica de la consulta.
Respuestas relacionadas para problemas derivados de esto:
- ¿Por qué nulo es igual a entero en WHERE?
- Consulta con LEFT JOIN que no devuelve filas para el conteo de 0
- Consulta SQL usando combinación externa y limitando registros secundarios para cada padre
- Unión externa izquierda que actúa como una unión interna
- Seleccionar filas que no están presentes en otra tabla
Etc.