Kā arī, kā šeit ietilpst LEFT JOIN
, RIGHT JOIN
un FULL JOIN
?
Pieņemot, ka apvienojat kolonnas, kurās nav dublikātu, kas ir ļoti izplatīts gadījums:
A un B iekšējā savienošana dod rezultātu A intersect B, t. i., Venna diagrammas krustojuma iekšējo daļu.
A un B ārējais savienojums dod rezultātu A savienojums B, t. i., Venna diagrammas savienojuma ārējās daļas.
Pieteikumi
Pieņemsim, ka jums ir divas tabulas ar vienu kolonnu katrā un šādiem datiem:
A B
- -
1 3
2 4
3 5
4 6
Ievērojiet, ka (1,2) ir unikāli A, (3,4) ir kopīgi, bet (5,6) ir unikāli B.
Iekšējā savienošana
Iekšējā apvienošana, izmantojot jebkuru no līdzvērtīgiem vaicājumiem, dod divu tabulu krustpunktus, t. i., divas kopīgas rindas.
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
Levas ārējā apvienošana
Izmantojot kreiso ārējo apvienojumu, tiks iegūtas visas A rindas un visas kopīgās B rindas.
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
Pareizā ārējā savienošana
Labā ārējā savienojuma rezultātā tiks iegūtas visas B rindas un visas kopīgās A rindas.
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
Pilna ārējā savienošana
Pilnīga ārējā savienošana sniegs A un B apvienojumu, t. i., visas A rindas un visas B rindas. Ja A rindai nav atbilstošas B rindas, tad B daļa ir nulle, un otrādi.
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
Iekšējā savienojumā rindas tiek parādītas tikai tad, ja savienojuma otrā (labajā) pusē ir atbilstošs ieraksts.
(Kreisajā) ārējā savienojumā tiek parādītas rindas par katru ierakstu kreisajā pusē, pat ja savienojuma otrā (labajā) pusē nav atbilstošu rindu. Ja nav atbilstošas rindas, otras (labās) puses slejās parādās NULL.
Iekšējiem savienojumiem ir nepieciešams, lai savienotajā tabulā pastāvētu ieraksts ar saistīto ID.
Ārējie savienojumi atgriezīs ierakstus kreisajā pusē pat tad, ja labajā pusē nav neviena ieraksta.
Piemēram, jums ir tabula Orders un tabula OrderDetails. Tās ir saistītas ar "OrderID".
Orders
OrderDetails
Pieprasījums
SELECT Orders.OrderID, Orders.CustomerName
FROM Orders
INNER JOIN OrderDetails
ON Orders.OrderID = OrderDetails.OrderID
atgriezīs tikai tos pasūtījumus, kuriem ir kaut kas arī tabulā OrderDetails.
Ja mainīsiet to uz OUTER LEFT JOIN
SELECT Orders.OrderID, Orders.CustomerName
FROM Orders
LEFT JOIN OrderDetails
ON Orders.OrderID = OrderDetails.OrderID
tad tas atgriezīs ierakstus no tabulas Orders, pat ja tajos nebūs ierakstu no tabulas OrderDetails.
To var izmantot, lai atrastu pasūtījumus, kuriem nav neviena ieraksta OrderDetails, kas norāda uz iespējamu nezināmu pasūtījumu, pievienojot kur klauzulu, piemēram, WHERE OrderDetails.OrderID IS NULL
.