Jak również pasują LEFT JOIN
, RIGHT JOIN
i FULL JOIN
?
Zakładając, że łączysz się z kolumnami bez duplikatów, co jest bardzo częstym przypadkiem:
Wewnętrzne złączenie A i B daje wynik A intersect B, czyli wewnętrzną część przecięcia diagramu Venn.
Zewnętrzne złączenie A i B daje wynik A union B, tj. zewnętrzne części unii diagramu Venn.
Przykłady.
Załóżmy, że mamy dwie tabele, każda z jedną kolumną, a dane są następujące:
A B
- -
1 3
2 4
3 5
4 6
Zauważ, że (1,2) są unikalne dla A, (3,4) są wspólne, a (5,6) są unikalne dla B.
Złączenie wewnętrzne
Złączenie wewnętrzne przy użyciu jednego z równoważnych zapytań daje przecięcie dwóch tabel, tj. dwa wiersze, które mają wspólne.
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
Lewe złączenie zewnętrzne
Złączenie zewnętrzne lewe daje wszystkie wiersze w A, plus wszystkie wspólne wiersze w 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
Prawe złączenie zewnętrzne
Złączenie zewnętrzne prawe daje wszystkie wiersze w B, plus wszystkie wspólne wiersze w 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
Pełne złączenie zewnętrzne
Pełne złączenie zewnętrzne da ci unię A i B, tj. wszystkie wiersze w A i wszystkie wiersze w B. Jeśli coś w A nie ma odpowiadającej wartości w B, to część B jest zerowa i vice versa.
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
Złączenie wewnętrzne pokazuje wiersze tylko wtedy, gdy istnieje pasujący rekord po drugiej (prawej) stronie złączenia.
Złączenie zewnętrzne (lewe) pokazuje wiersze dla każdego rekordu po lewej stronie, nawet jeśli nie ma pasujących wierszy po drugiej (prawej) stronie złączenia. Jeśli nie ma pasującego wiersza, kolumny po drugiej (prawej) stronie złączenia będą miały wartość NULL.
Złączenia wewnętrzne wymagają, aby rekord z powiązanym ID istniał w połączonej tabeli.
Złączenia zewnętrzne zwrócą rekordy dla lewej strony, nawet jeśli nic nie istnieje dla prawej strony.
Na przykład, masz tabelę Orders i OrderDetails. Są one powiązane przez "OrderID".
Orders.
OrderDetails
Zapytanie
SELECT Orders.OrderID, Orders.CustomerName
FROM Orders
INNER JOIN OrderDetails
ON Orders.OrderID = OrderDetails.OrderID
zwróci tylko te zamówienia, które mają również coś w tabeli OrderDetails.
Jeśli zmienisz to na OUTER LEFT JOIN
SELECT Orders.OrderID, Orders.CustomerName
FROM Orders
LEFT JOIN OrderDetails
ON Orders.OrderID = OrderDetails.OrderID
to zwróci rekordy z tabeli Orders, nawet jeśli nie mają one rekordów OrderDetails.
Możesz użyć tego do znalezienia zamówień, które nie mają żadnych OrderDetails wskazujących na możliwe osierocone zamówienie poprzez dodanie klauzuli where jak WHERE OrderDetails.OrderID IS NULL
.