Wat is het verschil tussen "INNER JOIN" en "OUTER JOIN"?

En hoe passen LEFT JOIN, RIGHT JOIN en FULL JOIN in dit plaatje?

Oplossing

Ervan uitgaande dat je samenvoegt op kolommen zonder duplicaten, wat een veel voorkomend geval is:

  • Een inner join van A en B geeft het resultaat van A intersect B, d.w.z. het binnenste deel van een Venn diagram intersectie.

  • Een outer join van A en B geeft het resultaat van A union B, d.w.z. de buitenste delen van een Venn diagram union.

Voorbeelden

Veronderstel dat je twee tabellen hebt, met elk een enkele kolom, en de volgende gegevens:

A    B
-    -
1    3
2    4
3    5
4    6

Merk op dat (1,2) uniek zijn voor A, (3,4) gemeenschappelijk zijn, en (5,6) uniek zijn voor B.

Inner join

Een inner join met behulp van een van de equivalente queries geeft de intersectie van de twee tabellen, d.w.z. de twee rijen die ze gemeen hebben.

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

Linker outer join

Een left outer join geeft alle rijen in A, plus alle gemeenschappelijke rijen in 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

Right outer join

Een right outer join geeft alle rijen in B, plus alle gemeenschappelijke rijen in 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

Volledige buitentoevoeging

Een full outer join geeft je de unie van A en B, d.w.z. alle rijen in A en alle rijen in B. Als iets in A geen corresponderend gegeven in B heeft, dan is het B gedeelte null, en omgekeerd.

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
Commentaren (17)

Een inner join toont alleen rijen als er een overeenkomend record is aan de andere (rechter) kant van de join.

Een (left) outer join toont rijen voor elke record aan de linkerkant, zelfs als er geen overeenkomende rijen zijn aan de andere (right) kant van de join. Als er geen overeenkomende rij is, zouden de kolommen voor de andere (rechter) kant NULLs tonen.

Commentaren (0)

Inner joins vereisen dat een record met een verwante ID bestaat in de joined tabel.

Outer joins zullen records teruggeven voor de linkerkant, zelfs als er niets bestaat voor de rechterkant.

U hebt bijvoorbeeld een tabel Orders en een tabel OrderDetails. Ze zijn gerelateerd door een "OrderID".

Orders

  • OrderID
  • KlantNaam

OrderDetails

  • OrderDetailID
  • OrderID
  • Productnaam
  • Aantal
  • Prijs

De aanvraag

SELECT Orders.OrderID, Orders.CustomerName
  FROM Orders 
 INNER JOIN OrderDetails
    ON Orders.OrderID = OrderDetails.OrderID

zal alleen Orders teruggeven die ook iets in de OrderDetails tabel hebben.

Als je het verandert in OUTER LEFT JOIN

SELECT Orders.OrderID, Orders.CustomerName
  FROM Orders 
  LEFT JOIN OrderDetails
    ON Orders.OrderID = OrderDetails.OrderID

dan zal het records uit de tabel Orders teruggeven, zelfs als ze geen OrderDetails records hebben.

Je kunt dit gebruiken om Orders te vinden die geen OrderDetails hebben wat wijst op een mogelijke verweesde order door een where clausule toe te voegen zoals WHERE OrderDetails.OrderID IS NULL.

Commentaren (1)