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 | eksempel@sqldat.com || 2 | Bart | Pitt | (231) 465-3497 | eksempel@sqldat.com || 3 | Nancy | Simpson | (489) 591-0408 | NULL || 4 | Boris | Trump | (349) 611-8908 | NULL || 5 | Woody | Eastwood | (308) 555-0112 | eksempel@sqldat.com |+------------+-------+------------+---- ------------+---------------------------+
Bemærk at:
PetTypeIdkolonne iPetstabel er en fremmednøgle tilPetTypeIdafPetTypestabel (som er den primære nøgle til den pågældende tabel).OwnerIdkolonne iPetstabel er en fremmednøgle tilOwnerIdkolonne iOwnerstabel.
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
PetOwnerer ikkeNULL(som sidstPetNameer), er det fordi det er et resultat af en strengsammenkædning. Jeg brugte T-SQLCONCAT()funktion til at sammenkæde ejerens for- og efternavn.