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