Hvordan passer LEFT JOIN
, RIGHT JOIN
og FULL JOIN
ind?
Hvis du antager, at du samkører på kolonner uden dubletter, hvilket er et meget almindeligt tilfælde:
En indre sammenføjning af A og B giver resultatet af A intersect B, dvs. den indre del af et Venn-diagram intersektion.
En ydre sammenføjning af A og B giver resultatet af A union B, dvs. de ydre dele af en union i et Venn-diagram.
Eksempler
Antag, at du har to tabeller med en enkelt kolonne hver og følgende data:
A B
- -
1 3
2 4
3 5
4 6
Bemærk, at (1,2) er unikke for A, (3,4) er fælles, og (5,6) er unikke for B.
Indre sammenføjning
En indre sammenføjning ved hjælp af en af de tilsvarende forespørgsler giver skæringspunktet mellem de to tabeller, dvs. de to rækker, som de har til fælles.
select * from a INNER JOIN b on a.a = b.b;
select a.*, b.* from a,b where a.a = b.b;
a | b
--+--
3 | 3
4 | 4
Links ydre sammenføjning
En venstre ydre sammenføjning giver alle rækker i A plus eventuelle fælles rækker i B.
select * from a LEFT OUTER JOIN b on a.a = b.b;
select a.*, b.* from a,b where a.a = b.b(+);
a | b
--+-----
1 | null
2 | null
3 | 3
4 | 4
Højre ydre sammenføjning
En højre ydre sammenføjning giver alle rækker i B plus eventuelle fælles rækker i A.
select * from a RIGHT OUTER JOIN b on a.a = b.b;
select a.*, b.* from a,b where a.a(+) = b.b;
a | b
-----+----
3 | 3
4 | 4
null | 5
null | 6
Fuldt ydre led
En fuld ydre sammenføjning giver dig foreningen af A og B, dvs. alle rækker i A og alle rækker i B. Hvis noget i A ikke har et tilsvarende datum i B, er B-delen nul og omvendt.
select * from a FULL OUTER JOIN b on a.a = b.b;
a | b
-----+-----
1 | null
2 | null
3 | 3
4 | 4
null | 6
null | 5
En indre sammenføjning viser kun rækker, hvis der er en matchende post på den anden (højre) side af sammenføjningen.
Et ydre (venstre) join viser rækker for hver post på venstre side, selv om der ikke er nogen matchende rækker på den anden (højre) side af joinet. Hvis der ikke er nogen matchende række, vil kolonnerne på den anden (højre) side vise NULLs.
Indre sammenføjninger kræver, at der findes en post med et relateret ID i den sammenføjede tabel.
Outer joins returnerer poster for den venstre side, selv om der ikke findes noget for den højre side.
Du har f.eks. en tabel Orders og en tabel OrderDetails. De er relateret ved hjælp af et "OrderID".
Orders
OrderDetails
Anmodning
SELECT Orders.OrderID, Orders.CustomerName
FROM Orders
INNER JOIN OrderDetails
ON Orders.OrderID = OrderDetails.OrderID
returnerer kun ordrer, der også har noget i tabellen OrderDetails.
Hvis du ændrer det til OUTER LEFT JOIN
SELECT Orders.OrderID, Orders.CustomerName
FROM Orders
LEFT JOIN OrderDetails
ON Orders.OrderID = OrderDetails.OrderID
så returnerer den poster fra tabellen Orders, selv om der ikke er nogen OrderDetails-poster.
Du kan bruge dette til at finde ordrer, der ikke har nogen OrderDetails, hvilket indikerer en mulig forældreløs ordre ved at tilføje en where-klausul som WHERE OrderDetails.OrderID IS NULL
.