Aký je rozdiel medzi "INNER JOIN" a "OUTER JOIN"?

Ako do toho zapadá LEFT JOIN, RIGHT JOIN a FULL JOIN?

Riešenie

Za predpokladu, že spájate stĺpce bez duplikátov, čo je veľmi častý prípad:

  • Vnútorné spojenie A a B dáva výsledok A pretína B, t. j. vnútornú časť priesečníka Vennov diagram.

  • Vonkajšie spojenie A a B dáva výsledok A union B, t. j. vonkajšie časti spojenia Vennovho diagramu.

Príklady

Predpokladajme, že máte dve tabuľky, každú s jedným stĺpcom, s nasledujúcimi údajmi:

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

Všimnite si, že (1,2) sú jedinečné pre A, (3,4) sú spoločné a (5,6) sú jedinečné pre B.

Vnútorné spojenie

Vnútorné spojenie pomocou niektorého z ekvivalentných dotazov poskytuje priesečník dvoch tabuliek, t. j. dva riadky, ktoré majú spoločné.

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

Vonkajšie ľavé spojenie

Ľavé vonkajšie spojenie poskytne všetky riadky v A a všetky spoločné riadky v 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

Pravé vonkajšie spojenie

Pravé vonkajšie spojenie poskytne všetky riadky v B plus všetky spoločné riadky v 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

Plné vonkajšie spojenie

Úplné vonkajšie spojenie vám poskytne spojenie A a B, t. j. všetky riadky v A a všetky riadky v B. Ak niečo v A nemá zodpovedajúci údaj v B, potom je časť B nulová a naopak.

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
Komentáre (17)

Vnútorné spojenie zobrazí riadky len vtedy, ak na druhej (pravej) strane spojenia existuje zodpovedajúci záznam.

Vonkajšie (ľavé) spojenie zobrazí riadky pre každý záznam na ľavej strane, aj keď na druhej (pravej) strane spojenia nie sú žiadne zodpovedajúce riadky. Ak neexistuje žiadny zodpovedajúci riadok, stĺpce pre druhú (pravú) stranu by zobrazovali NULL.

Komentáre (0)

Vnútorné spojenia vyžadujú, aby v spojenej tabuľke existoval záznam s príbuzným ID.

Vonkajšie spojenia vrátia záznamy pre ľavú stranu, aj keď pre pravú stranu nič neexistuje.

Napríklad máte tabuľku Orders a tabuľku OrderDetails. Sú prepojené údajom "OrderID".

Orders

  • OrderID
  • Názov zákazníka

OrderDetails

  • OrderDetailID
  • OrderID
  • ProductName
  • Množstvo
  • Cena

Požiadavka

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

vráti iba objednávky, ktoré majú niečo aj v tabuľke OrderDetails.

Ak to zmeníte na OUTER LEFT JOIN

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

potom sa vrátia záznamy z tabuľky Orders, aj keď nemajú žiadne záznamy OrderDetails.

Môžete to použiť na vyhľadanie objednávok, ktoré nemajú žiadne záznamy OrderDetails, čo naznačuje možnú osirelú objednávku pridaním klauzuly where, napríklad WHERE OrderDetails.OrderID IS NULL.

Komentáre (1)