Denne artikel giver et overblik over RIGHT JOIN
i SQL, samt nogle grundlæggende eksempler.
Også kendt som RIGHT OUTER JOIN
, RIGHT JOIN
returnerer rækker, der har data i den højre tabel (til højre for JOIN
søgeord), selvom der ikke er nogen matchende rækker i den venstre tabel.
Syntaks
Du angiver en højre joinforbindelse i FROM
klausul. Du kan bruge enten RIGHT JOIN
eller RIGHT OUTER JOIN
syntaks.
Brug af RIGHT JOIN
syntaks:
SELECT *
FROM Table1 RIGHT JOIN Table2
ON Table1.Column = Table2.Column;
Brug af RIGHT OUTER JOIN
syntaks:
SELECT *
FROM Table1 RIGHT 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 | Bird | | 2 | Cat | | 3 | Dog | | 4 | Rabbit | +-------------+-----------+ (4 rows affected)
Pets
tabel:
+---------+-------------+-----------+-----------+------------+ | PetId | PetTypeId | OwnerId | PetName | DOB | |---------+-------------+-----------+-----------+------------| | 1 | 2 | 3 | Fluffy | 2020-11-20 | | 2 | 3 | 3 | Fetch | 2019-08-16 | | 3 | 2 | 2 | Scratch | 2018-10-01 | | 4 | 3 | 3 | Wag | 2020-03-15 | | 5 | 1 | 1 | Tweet | 2020-11-28 | | 6 | 3 | 4 | Fluffy | 2020-09-17 | | 7 | 3 | 2 | Bark | NULL | | 8 | 2 | 4 | Meow | NULL | +---------+-------------+-----------+-----------+------------+ (8 rows affected)
Owners
tabel:
+-----------+-------------+------------+----------------+-------------------+ | OwnerId | FirstName | LastName | Phone | Email | |-----------+-------------+------------+----------------+-------------------| | 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.
Den rigtige deltagelsesforespørgsel
Her er et eksempel på at udføre en right join mod to af disse tabeller.
SELECT
p.PetName,
pt.PetType
FROM Pets p
RIGHT JOIN PetTypes pt
ON p.PetTypeId = pt.PetTypeId;
Resultat:
+-----------+-----------+ | PetName | PetType | |-----------+-----------| | Tweet | Bird | | Fluffy | Cat | | Scratch | Cat | | Meow | Cat | | Fetch | Dog | | Wag | Dog | | Fluffy | Dog | | Bark | Dog | | NULL | Rabbit | +-----------+-----------+ (9 rows affected)
Den rigtige joinforbindelse får os til at få en PetType
værdi, der ikke svarer til et PetName
. Konkret er der ingen kaniner som kæledyr. Men den rigtige 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 skete kun fordi Rabbit
var i den højre tabel (dvs. til højre for RIGHT JOIN
søgeord).
Her er, hvad der sker, hvis vi ændrer tabelrækkefølgen i vores forespørgsel.
SELECT
p.PetName,
pt.PetType
FROM PetTypes pt
RIGHT JOIN Pets p
ON p.PetTypeId = pt.PetTypeId;
Resultat:
+-----------+-----------+ | PetName | PetType | |-----------+-----------| | Fluffy | Cat | | Fetch | Dog | | Scratch | Cat | | Wag | Dog | | Tweet | Bird | | Fluffy | Dog | | Bark | Dog | | Meow | Cat | +-----------+-----------+ (8 rows affected)
Denne gang Rabbits
blev ikke returneret. Det er fordi dens tabel (PetTypes
) var på venstre side af sammenføjningen.
Vi bliver nødt til at ændre det til en venstre join eller en fuld join, hvis vi ville have Rabbits
skal returneres med denne bordbestilling.
Rejse Deltag på 3 borde
Her er et eksempel på at udføre en ret join på alle tre borde.
SELECT
p.PetName,
pt.PetType,
CONCAT(o.FirstName, ' ', o.LastName) AS PetOwner
FROM Pets p RIGHT JOIN PetTypes pt
ON p.PetTypeId = pt.PetTypeId
RIGHT JOIN Owners o
ON p.OwnerId = o.OwnerId;
Resultat:
+-----------+-----------+----------------+ | PetName | PetType | PetOwner | |-----------+-----------+----------------| | Tweet | Bird | Homer Connery | | Scratch | Cat | Bart Pitt | | Bark | Dog | Bart Pitt | | Fluffy | Cat | Nancy Simpson | | Fetch | Dog | Nancy Simpson | | Wag | Dog | Nancy Simpson | | Fluffy | Dog | Boris Trump | | Meow | Cat | Boris Trump | | NULL | NULL | Woody Eastwood | +-----------+-----------+----------------+ (9 rows affected)
Denne gang har vi en kæledyrsejer, der ikke har et kæledyr.
Vi kunne igen blande rækkefølgen af bordene rundt, og vi ville få et andet resultat.
SELECT
p.PetName,
pt.PetType,
CONCAT(o.FirstName, ' ', o.LastName) AS PetOwner
FROM Pets p RIGHT JOIN Owners o
ON p.OwnerId = o.OwnerId
RIGHT JOIN PetTypes pt
ON p.PetTypeId = pt.PetTypeId;
Resultat:
+-----------+-----------+---------------+ | PetName | PetType | PetOwner | |-----------+-----------+---------------| | Tweet | Bird | Homer Connery | | Fluffy | Cat | Nancy Simpson | | Scratch | Cat | Bart Pitt | | Meow | Cat | Boris Trump | | Fetch | Dog | Nancy Simpson | | Wag | Dog | Nancy Simpson | | Fluffy | Dog | Boris Trump | | Bark | Dog | Bart Pitt | | NULL | Rabbit | | +-----------+-----------+---------------+ (9 rows affected)
Denne gang fik vi den ekstra kæledyrstype (Rabbit
), men ikke den ekstra ejer.
Hvis du undrer dig over, hvorfor den sidste PetOwner
er ikke NULL
(som sidst PetName
er), er det fordi det er et resultat af en strengsammenkædning. Jeg brugte T-SQL CONCAT()
funktion til at sammenkæde ejerens for- og efternavn.