sql >> Database teknologi >  >> RDS >> PostgreSQL

Forklar JOIN vs. LEFT JOIN og WHERE-tilstandsforslag mere detaljeret

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.



  1. Brug af variabel i SQL LIKE-sætning

  2. En oversigt over SQL Join-typer med eksempler

  3. Sådan har du dynamisk SQL i MySQL Stored Procedure

  4. PyMySQL kan ikke oprette forbindelse til MySQL på localhost