PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Postgres Left Join with where condition


à esquerda juntar duas tabelas com uma condição where

Normalmente é errado para usar um LEFT [OUTER] JOIN e, em seguida, filtre com um WHERE condição, anulando assim o recurso especial de um LEFT JOIN para incluir todas as linhas da tabela esquerda incondicionalmente . Explicação detalhada:
  • Explique a sugestão de desempenho da condição JOIN vs. LEFT JOIN e WHERE com mais detalhes

Coloque condições para filtrar todas as linhas no WHERE cláusula (rid = 2 ), mas crie condições para unir linhas à esquerda de record_table para ser condições de junção reais:
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;

Conforme comentado, faz sentido incluir colunas de time_table no resultado, mas essa é minha adição opcional.

Você também precisa ser claro sobre os limites inferiores e superiores . A convenção geral é incluir o menor e excluir o limite superior no tempo (timestamp ) gamas. Daí meu uso de >= e < acima de.

Relacionado:
  • Consulta SQL em uma série temporal para calcular a média
  • Selecionar uma média de registros agrupados por períodos de 5 minutos

O desempenho não deve nenhum problema com os índices certos. Você precisa de um índice (ou PK) em time_table(rid) e outro em record_table(date) .