Faktisk WHERE
betingelser og JOIN
betingelser for [INNER] JOIN
svarer 100 % til PostgreSQL. (Det er god praksis at bruge eksplicit JOIN
betingelser for at gøre forespørgsler lettere at læse og vedligeholde).
Det samme er ikke sand for en LEFT JOIN
kombineret med en WHERE
tilstand på et bord til højre for sammenføjningen. Formålet med en LEFT JOIN
er at bevare alle rækker i venstre side af sammenføjningen, uanset en match i højre side. Hvis der ikke findes noget match, udvides rækken med NULL
værdier for kolonner i højre side. Manualen:
LEFT OUTER JOIN
Først udføres en indre sammenføjning. Derefter, for hver række i T1, der ikke opfylder sammenkædningsbetingelsen med nogen række i T2, tilføjes en sammenføjet række med nulværdier i kolonner i T2. De sammenføjede tabeller har således altid mindst én række for hver række i T1.
Hvis du derefter anvender en WHERE
betingelse, der kræver noget andet end en NULL
værdi på kolonner af tabeller på højre side, annullerer du effekten og tvangskonverterer LEFT [OUTER] JOIN
at fungere som en almindelig [INNER] JOIN
, bare (muligvis) dyrere på grund af en mere kompliceret forespørgselsplan.
I en forespørgsel med mange sammenføjede tabeller er Postgres (eller ethvert RDBMS) svært at finde den bedste (eller endda en god) forespørgselsplan. Antallet af teoretisk mulige sekvenser til at forbinde tabeller vokser faktorielt (!). Postgres bruger "Generisk forespørgselsoptimering" til opgaven, og der er nogle indstillinger til at påvirke den.
Tilsløring af forespørgslen med vildledende LEFT JOIN
som skitseret, gør forespørgselsplanlæggerens arbejde sværere, er vildledende for menneskelige læsere og antyder typisk fejl i forespørgselslogikken.
Relaterede svar på problemer, der stammer fra dette:
- Hvorfor er null lig med heltal i WHERE?
- Forespørgsel med LEFT JOIN returnerer ikke rækker for tæller på 0
- SQL-forespørgsel ved hjælp af outer join og begrænsende underordnede poster for hver forælder
- Venstre ydre sammenføjning fungerer som indre sammenføjning
- Vælg rækker, der ikke findes i en anden tabel
osv.