Jeg ser ofte folk kæmper med ideen om at slutte sig til et bord for sig selv eller flere gange i den samme forespørgsel (som det var her). Når det først er mestret, er det en fantastisk teknik at bruge på borde, der har mange relationer mellem rækkerne (såsom en liste over hold, der skal spille mod hinanden!). Som andre har påpeget, skal du bruge to inner join
s for at opnå dette:
select
*
from
games g
inner join teams t1 on
g.teamid1 = t1.teamid
inner join teams t2 on
g.teamid2 = t2.teamid
Så hvis dine games
tabellen ser sådan ud:
GameID TeamID1 TeamID2
----------------------------
1 1 3
2 4 2
3 2 1
Du vil få resultatsættet af:
g.GameID g.TeamID1 g.TeamID2 t1.TeamID t1.Name t2.TeamID t2.Name
----------------------------------------------------------------------------------
1 1 3 1 Lions 3 Bears
2 4 2 4 Oh My 2 Tigers
3 2 1 2 Tigers 1 Lions
Selvfølgelig ville jeg kalde disse kolonner i select
erklæring, hvis jeg var mig, for brugervenlighedens skyld:
select
g.GameID,
t1.Name as Team1,
t2.Name as Team2
from
...
På denne måde kan kolonner navngives passende i stedet for at have t1
og t2
kolonner deler de samme navne.
For nu at løse forvirringen om, hvad en left join
er. Ser du, en left join
vil tage alle rækkerne fra den første (eller venstre) tabel og derefter matche alle rækker på join-betingelsen med den anden (eller højre) tabel. For alle rækker fra den venstre tabel får du null
i alle kolonnerne til right
tabel.
Lad os dykke ned i et eksempel, og lad os sige, at nogen har indsat en null
for TeamID2
på en af rækkerne uanset årsagen. Lad os også sige, at et team af TeamID
4 plejede at eksistere, men gør det ikke mere.
GameID TeamID1 TeamID2
----------------------------
1 1 3
2 4 2
3 1 null
Lad os nu tage et kig på, hvad en left join
ville være i forhold til forespørgslen:
select
*
from
games g
left join teams t1 on
g.teamid1 = t1.teamid
left join teams t2 on
g.teamid2 = t2.teamid
Logisk set vil dette fange alle vores games
, og match dem derefter til de respektive teams
. Men hvis et TeamID
ikke eksisterer, får vi null
s. Det vil se sådan ud:
g.GameID g.TeamID1 g.TeamID2 t1.TeamID t1.Name t2.TeamID t2.Name
----------------------------------------------------------------------------------
1 1 3 1 Lions 3 Bears
2 4 2 null null 2 Tigers
3 1 null 1 Lions null null
Derfor en left join
vil kun være nødvendigt, hvis et hold er valgfrit.
I dit tilfælde vil du bruge en inner join
at deltage i et bord flere gange. Dette er en meget almindelig praksis og er ret nyttig. Det undgår nogle af faldgruberne ved underforespørgsler (især på MySQL), mens det giver dig mulighed for at få fat i data fra tabellen til sammenligninger i tabellen. Dette er markant nyttigt, når du prøver at finde rækkefølgen af noget eller relaterede rækker.
Jeg håber i hvert fald, at dette meget omstændelige svar kan hjælpe nogen et sted.