Denne artikel giver et overblik over FULL JOIN
i SQL, samt nogle grundlæggende eksempler.
SQL'en FULL JOIN
(eller FULL OUTER JOIN
) returnerer alle rækker, så længe der er matchende data i en af tabellerne.
Det er som at have begge en venstre højre join i én join.
Syntaks
Du angiver en fuld deltagelse i FROM
klausul. Du kan bruge enten FULL JOIN
eller FULL OUTER JOIN
syntaks.
Brug af FULL JOIN
syntaks:
SELECT *
FROM Table1 FULL JOIN Table2
ON Table1.Column = Table2.Column;
Brug af FULL OUTER JOIN
syntaks:
SELECT *
FROM Table1 FULL OUTER JOIN Table2
ON Table1.Column = Table2.Column;
Begge disse gør nøjagtig det samme. Det er bare, at OUTER
søgeord er valgfrit.
Eksempler
Her er nogle eksempler til demonstration.
Eksempel på data
For det første er her de tabeller, vi skal bruge til eksemplerne.
PetTypes
tabel:
+-------------+------------+| PetTypeId | PetType ||-------------+---------|| 1 | Fugl || 2 | Kat || 3 | Hund || 4 | Kanin |+-------------+------------+(4 rækker påvirket)
Pets
tabel:
+---------+----------------------- -+------------+| PetId | PetTypeId | OwnerId | Kæledyrsnavn | DOB ||--------+------------------------ +------------|| 1 | 2 | 3 | Fluffy | 20-11-2020 || 2 | 3 | 3 | Hent | 2019-08-16 || 3 | 2 | 2 | Ridse | 2018-10-01 || 4 | 3 | 3 | Wag | 15-03-2020 || 5 | 1 | 1 | Tweet | 28-11-2020 || 6 | 3 | 4 | Fluffy | 17-09-2020 || 7 | 3 | 2 | Bark | NULL || 8 | 2 | 4 | Mjav | NULL |+----------------------------- +------------+(8 rækker påvirket)
Owners
tabel:
+-------+-----------------+------ ----------+---------------------------+| OwnerId | Fornavn | Efternavn | telefon | E-mail ||------------------------------------------- -----------------------|| 1 | Homer | Connery | (308) 555-0100 | [email protected] || 2 | Bart | Pitt | (231) 465-3497 | [email protected] || 3 | Nancy | Simpson | (489) 591-0408 | NULL || 4 | Boris | Trump | (349) 611-8908 | NULL || 5 | Woody | Eastwood | (308) 555-0112 | [email protected] |+------------+-------+------------+---- ------------+---------------------------+
Bemærk at:
PetTypeId
kolonne iPets
tabel er en fremmednøgle tilPetTypeId
afPetTypes
tabel (som er den primære nøgle til den pågældende tabel).OwnerId
kolonne iPets
tabel er en fremmednøgle tilOwnerId
kolonne iOwners
tabel.
Fuld tilmeldingsforespørgsel
Her er et eksempel på at udføre en fuld join mod to af disse borde.
SELECT
p.PetName,
pt.PetType
FROM Pets p
FULL JOIN PetTypes pt
ON p.PetTypeId = pt.PetTypeId;
Resultat:
+-------+------------+| Kæledyrsnavn | PetType ||-----------+--------|| Tweet | Fugl || Fluffy | Kat || Ridse | Kat || Mjav | Kat || Hent | Hund || Wag | Hund || Fluffy | Hund || Bark | Hund || NULL | Kanin |+-----------+-----------+(9 rækker påvirket)
I dette eksempel får vi en PetType
værdi, der ikke svarer til et PetName
. Dette skyldes, at der ikke er kaniner som kæledyr. Men den fulde join forårsager Rabbit
skal returneres, selvom der ikke er noget kæledyr i Pets
bord af den type. Dette resulterer i en NULL
værdi i PetName
kolonne mod Rabbit
.
Dette er det samme resultat, som vi ville have fået, hvis vi havde brugt en rigtig joinforbindelse, fordi PetTypes
tabellen er til højre for JOIN
søgeord. Dette ville ikke være sket med en venstre join, fordi PetTypes
tabellen er ikke til venstre for JOIN
søgeord. Hvis vi ville genskabe det med en venstre join, skulle vi ændre rækkefølgen af tabellerne, så PetTypes
tabellen var til venstre for JOIN
søgeord.
Her er, hvad der sker, hvis vi ændrer bordrækkefølgen i vores forespørgsel, når vi bruger en fuld joinforbindelse.
SELECT
p.PetName,
pt.PetType
FROM PetTypes pt
FULL JOIN Pets p
ON p.PetTypeId = pt.PetTypeId;
Resultat:
+-------+------------+| Kæledyrsnavn | PetType ||-----------+--------|| Tweet | Fugl || Fluffy | Kat || Ridse | Kat || Mjav | Kat || Hent | Hund || Wag | Hund || Fluffy | Hund || Bark | Hund || NULL | Kanin |+-----------+-----------+(9 rækker påvirket)
Vi får præcis det samme resultat. Dette skyldes, at den fulde join returnerer alle rækker, så længe der er matchende data i en af tabellerne. Som nævnt er det som at have en venstre og højre joinforbindelse i én join.
Fuld tilslutning på 3 borde
Her er et eksempel på at udføre en fuld join på alle tre borde.
SELECT
p.PetName,
pt.PetType,
CONCAT(o.FirstName, ' ', o.LastName) AS PetOwner
FROM Owners o FULL JOIN Pets p
ON p.OwnerId = o.OwnerId
FULL JOIN PetTypes pt
ON p.PetTypeId = pt.PetTypeId;
Resultat:
+-------+------------+----------------+| Kæledyrsnavn | PetType | PetOwner ||-----------+-----------+----------------|| Tweet | Fugl | Homer Connery || Ridse | Kat | Bart Pitt || Bark | Hund | Bart Pitt || Fluffy | Kat | Nancy Simpson || Hent | Hund | Nancy Simpson || Wag | Hund | Nancy Simpson || Fluffy | Hund | Boris Trump || Mjav | Kat | Boris Trump || NULL | NULL | Woody Eastwood || NULL | Kanin | |+-----------+-----------+----------------+(10 rækker påvirket)Denne gang har vi en kæledyrsejer, der ikke har et kæledyr, samt en kæledyrstype, der ikke er tildelt et kæledyr.
Hvis vi blander rækkefølgen af bordene rundt, får vi det samme resultat, selvom rækkerne er anført i en anden rækkefølge.
SELECT p.PetName, pt.PetType, CONCAT(o.FirstName, ' ', o.LastName) AS PetOwner FROM PetTypes pt FULL JOIN Pets p ON p.PetTypeId = pt.PetTypeId FULL JOIN Owners o ON p.OwnerId = o.OwnerId;
Resultat:
-----------+-----------+----------------+| Kæledyrsnavn | PetType | PetOwner ||-----------+-----------+----------------|| Tweet | Fugl | Homer Connery || Fluffy | Kat | Nancy Simpson || Ridse | Kat | Bart Pitt || Mjav | Kat | Boris Trump || Hent | Hund | Nancy Simpson || Wag | Hund | Nancy Simpson || Fluffy | Hund | Boris Trump || Bark | Hund | Bart Pitt || NULL | Kanin | || NULL | NULL | Woody Eastwood |+-----------+------------+----------------+(10 rækker påvirket)Og hvis vi blander dem igen, får vi stadig det samme resultat.
SELECT p.PetName, pt.PetType, CONCAT(o.FirstName, ' ', o.LastName) AS PetOwner FROM Pets p FULL JOIN Owners o ON p.OwnerId = o.OwnerId FULL JOIN PetTypes pt ON p.PetTypeId = pt.PetTypeId;
Resultat:
+-------+------------+----------------+| Kæledyrsnavn | PetType | PetOwner ||-----------+-----------+----------------|| Fluffy | Kat | Nancy Simpson || Hent | Hund | Nancy Simpson || Ridse | Kat | Bart Pitt || Wag | Hund | Nancy Simpson || Tweet | Fugl | Homer Connery || Fluffy | Hund | Boris Trump || Bark | Hund | Bart Pitt || Mjav | Kat | Boris Trump || NULL | NULL | Woody Eastwood || NULL | Kanin | |+-----------+-----------+----------------+(10 rækker påvirket)Hvis du undrer dig over, hvorfor den sidste
PetOwner
er ikkeNULL
(som sidstPetName
er), er det fordi det er et resultat af en strengsammenkædning. Jeg brugte T-SQLCONCAT()
funktion til at sammenkæde ejerens for- og efternavn.