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

PostgreSQL:Usar a instrução AND no LEFT JOIN não está funcionando conforme o esperado


A confusão em torno de LEFT JOIN e WHERE cláusula foi esclarecida muitas vezes:

Esta pergunta interessante restos:

Não há dicas de consulta explícitas no Postgres. (O que é uma questão de debate contínuo.) Mas ainda existem vários truques para fazer o Postgres dobrar seu caminho.

Mas primeiro, pergunte a si mesmo: Por que o planejador de consultas estimou que o plano escolhido seria mais barato para começar? A configuração do seu servidor é basicamente sã? Configurações de custo adequadas? autovacuum corrida? Versão do Postgres desatualizada? Você está trabalhando em torno de um problema subjacente que realmente deve ser corrigido?

Se você forçar o Postgres a fazer do seu jeito, você deve ter certeza de que ele não irá disparar de volta, após uma atualização de versão ou atualização da configuração do servidor... É melhor você saber exatamente o que está fazendo.

Dito isso, você pode forçar o Postgres a "filtrar alguns registros antes de fazer o JOIN " com uma subconsulta onde você adiciona OFFSET 0 - que é apenas ruído, logicamente, mas impede o Postgres de reorganizá-lo na forma de uma junção regular. (Dica de consulta afinal)
SELECT la.listing_id, la.id, lar.*
FROM  (
   SELECT listing_id, id
   FROM   la
   WHERE  listing_id = 2780
   OFFSET 0
   ) la
LEFT   JOIN lar  ON lar.application_id = la.id;

Ou você pode usar um CTE (menos obscuro, mas mais caro). Ou outros truques como definir certos parâmetros de configuração. Ou, neste caso específico, eu usaria um LATERAL juntar para o mesmo efeito:
SELECT la.listing_id, la.id, lar.*
FROM   la
LEFT  JOIN LATERAL (
   SELECT *
   FROM   lar
   WHERE  application_id = la.id
   )  lar ON true
WHERE  la.listing_id = 2780;

Relacionado:

Aqui está um extenso blog sobre dicas de consulta do 2ndQuadrant. Cinco anos de idade, mas ainda válido.