sql >> Database teknologi >  >> RDS >> Sqlserver

Tre bord joins med andre joins end INNER JOIN

Ja, jeg bruger alle tre af disse JOINs, selvom jeg plejer at holde mig til kun at bruge LEFT (YDRE) JOIN s i stedet for at blande LEFT og RIGHT JOINs. Jeg bruger også FULD YDRE JOIN s og CROSS JOIN s.

Sammenfattende en INNER JOIN begrænser resultatsættet til kun de poster, der er opfyldt af JOIN-betingelsen. Overvej følgende tabeller

EDIT: Jeg har omdøbt tabelnavnene og præfikset dem med @ så tabelvariabler kan bruges til alle, der læser dette svar og vil eksperimentere.

Hvis du også gerne vil eksperimentere med dette i browseren, Jeg har sat det hele op på SQL Fiddle også;

@Tabel1id | navn---------1 | One2 | To3 | Tre4 | Fire@Tabel2id | navn---------1 | Agerhøne2 | Turtelduer3 | Franske høns5 | Guldringe

SQL-kode

ERKLÆR @Tabel1 TABEL (id INT PRIMÆR NØGLE KLUSTERET, [navn] VARCHAR(25))INSERT INTO @Table1 VALUES(1, 'One');INSERT INTO @Table1 VALUES(2, 'To');INSERT INTO @Table1 VALUES(3, 'Tre');INSERT INTO @Table1 VALUES(4, 'Fire');DECLARE @Table2 TABEL (id INT PRIMARY KEY CLUSTED, [navn] VARCHAR(25))INSERT INTO @Table2 VALUES(1, 'Partridge');INSERT INTO @Table2 VALUES(2, 'Turtle Doves');INSERT INTO @Table2 VALUES(3, 'Franske høns');INSERT INTO @Table2 VALUES(5, 'Guldringe'); 

En INNER JOIN SQL-sætning, sammenføjet på id felt

VÆLG t1.id, t1.name, t2.nameFROM @Tabel1 t1INNER JOIN @Tabel2 t2 PÅ t1.id =t2.id 

Resultater i

id | navn | navn----------------1 | En | Agerhøne2 | To | Turtelduer3 | Tre| Franske høns

En LEFT JOIN returnerer et resultatsæt med alle poster fra tabellen i venstre side af joinforbindelsen (hvis du skulle udskrive sætningen som en one liner, den tabel der vises først) og felter fra tabellen på højre side af joinforbindelsen der matcher join-udtrykket og er inkluderet i SELECT klausul. Mangler detaljer vil blive udfyldt med NULL

VÆLG t1.id, t1.name, t2.nameFROM @Tabel1 t1LEFT JOIN @Tabel2 t2 PÅ t1.id =t2.id 

Resultater i

id | navn | navn----------------1 | En | Agerhøne2 | To | Turtelduer3 | Tre| Franske høns4 | Fire | NULL

En RIGHT JOIN er den samme logik som en LEFT JOIN men vil returnere alle poster fra højre side af joinforbindelsen og felter fra venstre side, der matcher joinudtrykket og er inkluderet i SELECT klausul.

VÆLG t1.id, t1.name, t2.nameFROM @Tabel1 t1RIGHT JOIN @Tabel2 t2 PÅ t1.id =t2.id 

Resultater i

id | navn | navn----------------1 | En | Agerhøne2 | To | Turtelduer3 | Tre| Franske HønsNULL| NULL| Guldringe

Selvfølgelig er der også FULL YDRE JOIN , som inkluderer poster fra begge sammenføjede tabeller og udfylder eventuelle manglende detaljer med NULL.

VÆLG t1.id, t1.name, t2.nameFROM @Tabel1 t1FULD YDRE JOIN @Tabel2 t2 PÅ t1.id =t2.id 

Resultater i

id | navn | navn----------------1 | En | Agerhøne2 | To | Turtelduer3 | Tre| Franske høns4 | Fire | NULLNULL| NULL| Guldringe

Og en CROSS JOIN (også kendt som et CARTESIAN PRODUCT ), som simpelthen er et produkt af krydsanvendelse af felter i SELECT sætning fra én tabel med felterne i SELECT udsagn fra den anden tabel. Bemærk, at der ikke er noget join-udtryk i en CROSS JOIN

VÆLG t1.id, t1.name, t2.nameFROM @Tabel1 t1CROSS JOIN @Tabel2 t2 

Resultater i

id | navn | navn------------------1 | En | Agerhøne2 | To | Agerhøne3 | Tre | Agerhøne4 | Fire | Agerhøne1 | En | Turtelduer2 | To | Turtelduer3 | Tre | Turtelduer4 | Fire | Turtelduer1 | En | Franske høns2 | To | Franske høns3 | Tre | Franske høns4 | Fire | Franske Høns1 | En | Guldringe2 | To | Guldringe3 | Tre | Guldringe4 | Fire | Guldringe

EDIT:

Forestil dig, at der nu er en tabel3

@Table3id | navn---------2 | Prime 13 | Prime 25 | Prime 3 

SQL-koden

DECLARE @Tabel3 TABEL (id INT PRIMARY KEY CLUSTED, [navn] VARCHAR(25))INSERT INTO @Table3 VALUES(2, 'Prime 1');INSERT INTO @Table3 VALUES(3, 'Prime 2) ');INSERT INTO @Table3 VALUES(5, 'Prime 3'); 

Nu er alle tre tabeller samlet med INNER JOINS

VÆLG t1.id, t1.name, t2.name, t3.nameFRA @Tabel1 t1INNER JOIN @Tabel2 t2 PÅ t1.id =t2.idINNER JOIN @Tabel3 t3 PÅ t1.id =t3.id 

Resultater i

id | navn | navn | navn---------------------------------------2 | To | Turtelduer | Prime 13 | Tre| Franske høns | Prime 2

Det kan måske hjælpe at forstå dette resultat ved at tro, at poster med id 2 og 3 er de eneste fælles for alle 3 tabeller og er også det felt, vi slutter os til hvert bord på.

Nu alle tre med LEFT JOINS

VÆLG t1.id, t1.name, t2.name, t3.nameFROM @Tabel1 t1VENSTRE JOIN @Tabel2 t2 PÅ t1.id =t2.idVENSTRE JOIN @Tabel3 t3 PÅ t1.id =t3.id 

Resultater i

id | navn | navn | navn---------------------------------------1 | En | Agerhøne | NULL2 | To | Turtelduer | Prime 13 | Tre| Franske høns | Prime 24 | Fire | NULL | NULL

Joels svar er en god forklaring til at forklare dette resultatsæt (tabel 1 er basis-/oprindelsestabellen).

Nu med en INNER JOIN og en LEFT JOIN

VÆLG t1.id, t1.name, t2.name, t3.nameFRA @Tabel1 t1INDRE JOIN @Tabel2 t2 PÅ t1.id =t2.idLEFT JOIN @Tabel3 t3 PÅ t1.id =t3.id 

Resultater i

id | navn | navn | navn---------------------------------------1 | En | Agerhøne | NULL2 | To | Turtelduer | Prime 13 | Tre| Franske høns | Prime 2

Selvom vi ikke kender den rækkefølge, som forespørgselsoptimeringsværktøjet vil udføre handlingerne i, vil vi se på denne forespørgsel fra top til bund for at forstå resultatsættet. INNER JOIN på id'er mellem Tabel1 og Tabel2 vil begrænse resultatsættet til kun de poster, der er opfyldt af join-betingelsen, dvs. de tre rækker, som vi så i det allerførste eksempel. Denne midlertidige resultatsættet vil derefter være LEFT JOIN red til tabel 3 om id mellem tabel 1 og tabeller; Der er poster i tabel3 med id 2 og 3, men ikke id 1, så feltet t3.name vil have detaljer for 2 og 3, men ikke 1.



  1. Sådan konverteres en streng til en dato i PostgreSQL

  2. Indsætter i Oracle og henter det genererede sekvens-id

  3. Bestemmelse af påskedatoerne for ethvert år i Oracle PLSQL

  4. Sådan indstilles en standardværdi for en eksisterende kolonne