Hva er forskjellen mellom "INNER JOIN" og "OUTER JOIN"?

Og hvordan passer LEFT JOIN, RIGHT JOIN og FULL JOIN inn?

Løsning

Forutsatt at du blir med på kolonner uten duplikater, noe som er et veldig vanlig tilfelle:

  • En indre sammenføyning av A og B gir resultatet av at A skjærer B, dvs. den indre delen av et Venn-diagram skjæringspunkt.

  • En ytre sammenføyning av A og B gir resultatene av A union B, dvs. de ytre delene av et Venn-diagram union.

Eksempler.

Anta at du har to tabeller, med én kolonne i hver, og data som følger:

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

Legg merke til at (1,2) er unike for A, (3,4) er felles og (5,6) er unike for B.

Innre sammenføyning

En indre kobling ved hjelp av en av de tilsvarende spørringene gir skjæringspunktet mellom de to tabellene, dvs. de to radene de har til felles.

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

Left outer join

En left outer join vil gi alle rader i A, pluss eventuelle felles rader 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øyre ytre sammenføyning

En høyre ytre sammenføyning vil gi alle rader i B, pluss eventuelle felles rader 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

Full outer join

En full outer join vil gi deg foreningen av A og B, dvs. alle radene i A og alle radene i B. Hvis noe i A ikke har et tilsvarende datum i B, er B-delen null, 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
Kommentarer (17)

En indre sammenføyning viser bare rader hvis det finnes en matchende post på den andre (høyre) siden av sammenføyningen.

En (venstre) ytre sammenføyning viser rader for hver post på venstre side, selv om det ikke er noen matchende rader på den andre (høyre) siden av sammenføyningen. Hvis det ikke er noen matchende rad, vil kolonnene for den andre (høyre) siden vise NULL.

Kommentarer (0)

Indre sammenføyninger krever at det finnes en post med en relatert ID i den sammenføyde tabellen.

Ytre sammenføyninger vil returnere poster for venstre side selv om det ikke finnes noe for høyre side.

Du har for eksempel en Order og en OrderDetails-tabell. De er relatert med en "OrderID".

Bestillinger.

  • OrdreID
  • Kundenavn

OrderDetails (Bestillingsdetaljer)

  • OrderDetailID
  • OrdreID
  • Produktnavn
  • Antall
  • Pris

Forespørselen

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

vil bare returnere bestillinger som også har noe i OrderDetails-tabellen.

Hvis du endrer det til OUTER LEFT JOIN

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

vil den returnere poster fra Order-tabellen selv om de ikke har noen OrderDetails-poster.

Du kan bruke dette til å finne bestillinger som ikke har noen OrderDetails som indikerer en mulig foreldreløs bestilling ved å legge til en where-klausul som WHERE OrderDetails.OrderID IS NULL.

Kommentarer (1)