sql >> Base de Datos >  >> RDS >> PostgreSQL

Postgres Left Join con condición where

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) .