sql >> Databasteknik >  >> RDS >> PostgreSQL

PostgreSQL:Att använda AND-satsen i LEFT JOIN fungerar inte som förväntat

Förvirringen kring LEFT JOIN och WHERE klausul har förtydligats många gånger:

Denna intressanta fråga kvar:

Det finns inga explicita frågetips i Postgres. (Vilket är en fråga om pågående debatt.) Men det finns fortfarande olika knep för att få Postgres att böja dig.

Men först, fråga dig själv: Varför uppskattade frågeplaneraren att den valda planen var billigare till att börja med? Är din serverkonfiguration i princip sund? Är kostnadsinställningarna tillräckliga? autovacuum löpning? Postgres version föråldrad? Arbetar du kring ett underliggande problem som verkligen borde åtgärdas?

Om du tvingar Postgres att göra det på ditt sätt, bör du vara säker på att det inte kommer att avfyras, efter en versionsuppgradering eller uppdatering av serverkonfigurationen ... Det är bäst att du vet vad du gör exakt.

Som sagt, du kan tvinga Postgres att "filtrera bort några poster innan du gör JOIN " med en underfråga där du lägger till OFFSET 0 - vilket bara är brus, logiskt, men hindrar Postgres från att arrangera om det till formen av en vanlig join. (Frågetips trots allt)

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;

Eller så kan du använda en CTE (mindre obskyr, men dyrare). Eller andra knep som att ställa in vissa konfigurationsparametrar. Eller, i det här specifika fallet, skulle jag använda en LATERAL gå med i samma effekt:

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;

Relaterat:

Här är en omfattande blogg om frågetips från 2ndQuadrant. Fem år gammal men fortfarande giltig.



  1. MySQL:Alla tabeller OK men fortfarande ERROR 1577 (systemtabeller som används av Event Scheduler hittades skadade)

  2. EM12c Databas Tid Spendet Väntar på varningar

  3. Det går inte att lägga till eller uppdatera en underordnad rad:en begränsning av främmande nyckel misslyckas

  4. Sekvenser som inte påverkas av transaktioner?