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