unir dos tablas a la izquierda con una condición where
Suele ser incorrecto para usar un LEFT [OUTER] JOIN
y luego filtrar con WHERE
condición, anulando así la característica especial de un LEFT JOIN
para incluir todas las filas de la tabla de la izquierda sin condiciones . Explicación detallada:
- Explicar JOIN frente a LEFT JOIN y la sugerencia de rendimiento de la condición WHERE con más detalle
Poner condiciones que supuestamente filtran todas las filas en WHERE
cláusula (rid = 2
), pero crea condiciones para unir filas a la izquierda desde record_table
parecen ser condiciones de unión reales:
SELECT t.start_date, t.end_date -- adding those
, r.id, r.name, r.date
FROM time_table t
LEFT JOIN record_table r ON r.date >= t.start_date
AND r.date < t.end_date
WHERE t.rid = 2;
Como se comentó, tiene sentido incluir columnas de time_table
en el resultado, pero esa es mi adición opcional.
También debe tener claro los límites inferior y superior . La convención general es incluir el inferior y excluir el límite superior en el tiempo (timestamp
) rangos. De ahí mi uso de >=
y <
arriba.
Relacionado:
- Consulta SQL en una serie de tiempo para calcular el promedio
- Seleccionar un promedio de registros agrupados por períodos de 5 minutos
El rendimiento debería ser ningún problema con los índices correctos. Necesita un índice (o PK) en time_table(rid)
y otro en record_table(date)
.