Effektivt, WHERE
villkor och JOIN
villkor för [INNER] JOIN
motsvarar 100 % i PostgreSQL. (Det är god praxis att använda explicit JOIN
villkor för att göra frågor lättare att läsa och underhålla.
Detsamma är inte sant för en LEFT JOIN
kombinerat med en WHERE
skick på en tabell till höger om sammanfogningen. Syftet med en LEFT JOIN
är att bevara alla rader på vänster sida av sammanfogningen, oavsett en matchning på höger sida. Om ingen matchning hittas utökas raden med NULL
värden för kolumner på höger sida. Manualen:
LEFT OUTER JOIN
Först utförs en inre sammanfogning. Sedan, för varje rad i T1 som inte uppfyller kopplingsvillkoret med någon rad i T2, läggs en sammanfogad rad till med nollvärden i kolumner i T2. Således har de sammanfogade tabellerna alltid minst en rad för varje rad i T1.
Om du sedan använder en WHERE
villkor som kräver något annat än en NULL
värde på kolumner av tabeller på höger sida, annullerar du effekten och tvångskonverterar LEFT [OUTER] JOIN
att fungera som en vanlig [INNER] JOIN
, bara (möjligen) dyrare på grund av en mer komplicerad frågeplan.
I en fråga med många sammanfogade tabeller är Postgres (eller något RDBMS) svårt att hitta den bästa (eller till och med en bra) frågeplan. Antalet teoretiskt möjliga sekvenser för att sammanfoga tabeller växer faktoriellt (!). Postgres använder "Generic Query Optimizer" för uppgiften och det finns några inställningar för att påverka den.
Förvirrar frågan med vilseledande LEFT JOIN
som beskrivs, gör frågeplanerarens arbete svårare, är vilseledande för mänskliga läsare och antyder vanligtvis fel i frågelogiken.
Relaterade svar för problem som härrör från detta:
- Varför är null lika med heltal i WHERE?
- Fråga med LEFT JOIN returnerar inte rader för antalet 0
- SQL-fråga som använder yttre koppling och begränsande underordnade poster för varje förälder
- Vänster yttre sammanfogning fungerar som en inre sammanfogning
- Välj rader som inte finns i andra tabeller
Etc.