Left outer join condición on o where
La condición ON
estipula qué filas serán agregadas durante el proceso de hacer el join, mientras que la condición WHERE
actúa como filtro sobre las filas que actualmente ya fueron retornadas por el join.
Para este tipo de joins so existe alguna diferencia sustancial entre utilizar los filtros en la condición on
y la condición where
.
Tabla Estudiantes
| ESTUDIANTE_ID | NOMBRE |
|---------------|--------------|
| 1 | Carlos |
| 2 | Ramón |
| 3 | Ricardo |
Tabla Calificaciones
| ID | ESTUDIANTE_ID | MATERIA | CALIFICACION |
|----|---------------|-------------|--------------|
| 1 | 1 | MATEMATICAS | 10 |
| 1 | 1 | ESPAÑOL | 9 |
| 2 | 2 | ESPAÑOL | 8 |
| 3 | Ricardo | MATEMATICAS | 6 |
Se desea obtener una lista de todos los alumnos incluidos los que no tomaron matemáticas.
SELECT nombre, calificaciones.calificacion as calificacion_mate
from ESTUDIANTES
LEFT OUTER
JOIN CALIFICACIONES
ON estudiantes.estudiante_id
= calificaciones.estudiante_id
where calificaciones.materia = 'MATEMATICAS'
Primero este query retorna todos los estudiantes. Para los que no tomaron matemáticas, la fila retornada producto del join tendrá NULL
en todas las columnas de la tabla Calificaciones. Pero luego con la condición where
se filtrarán y obtendrán solo las columnas que la materia sea MATEMÁTICAS (descartando erroneamente a los alumnos que no cursaron matemáticas).
Este query tiene el mismo efecto que si se hubiera ejecutado un inner join
.
Resultado:
| NOMBRE | CALIFICACION_MATE |
|---------|-------------------|
| Carlos | 10.0 |
| Ricardo | 6.0 |
SELECT nombre, calificaciones.calificacion as calificacion_mate
from ESTUDIANTES
LEFT OUTER
JOIN CALIFICACIONES
ON estudiantes.estudiante_id
= calificaciones.estudiante_id
AND calificaciones.materia = 'MATEMATICAS'
En este query la condición del join obtiene los alumnos que tienen calificación en MATEMÁTICAS además de los que no tienen calificación en matemáticas (porque se trata de un left outer join
).
Resultado:
| NOMBRE | CALIFICACION_MATE |
|---------|-------------------|
| Carlos | 10.0 |
| Ramón | null |
| Ricardo | 6.0 |
Si deseas un LEFT OUTER JOIN
, asegurate que cualquier condición del filtro esté en la condición on
en vez de en where
.