iberck
11/17/2015 - 4:23 PM

Left outer join condición on o where

Left outer join condición on o where

Diferencia entre la condición ON y 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.

Inner joins

Para este tipo de joins so existe alguna diferencia sustancial entre utilizar los filtros en la condición on y la condición where.

¿Left outer join con ON o con 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.

Query 1

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               |

Query 2

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               |

Conclusión

Si deseas un LEFT OUTER JOIN, asegurate que cualquier condición del filtro esté en la condición on en vez de en where.