Złączenia krzyżowe CROSS JOIN
Ostatnim rodzajem złączenia jest złączenie krzyżowe (ang. cross join). Na początek warto zaznaczyć, że nie jest to typ złączenia wewnętrznego czy zewnętrznego. Jest ono bowiem stosowane do złączenia dwóch tabel bez określenia relacji występującej między nimi. Wskutek tego w wyniku zapytania z klauzulą CROSS JOIN znajdą się wszystkie możliwe kombinacje wartości, jakie znalazły się w wierszach obu łączonych ze sobą tabel. W języku technicznym takie działanie nosi nazwę iloczynu kartezjańskiego (ang. Cartesian product). Jeśli na przykład w jednej tabeli znajdują się trzy wiersze, a w drugiej są cztery rekordy, w wyniku zastosowania złączenia krzyżowego otrzymamy dwanaście wierszy. Złączenie to ma zatem dość specyficzny charakter, dlatego rzadko jest ono stosowane w praktyce.
Przyjrzyjmy się teraz dwóm przykładom zastosowania złączenia krzyżowego. Najpierw wyobraźmy sobie, że produkujemy koszulki w trzech rozmiarach i czterech kolorach. W tabeli RozmiaryKoszulek przechowywane są informacje o oferowanych przez nas rozmiarach:
IDRozmiaru | Rozmiar |
1 | Mały |
2 | Średni |
3 | Duży |
KoloryKoszulek przechowywane są natomiast informacje o dostępnych kolorach naszych produktów:
IDKoloru | Kolor |
1 | Czerwony |
2 | Niebieski |
3 | Zielony |
4 | Żółty |
Powiedzmy, że chcielibyśmy ustalić wszystkie możliwe kombinacje wielkości koszulek i ich kolorów, które moglibyśmy wyprodukować. W tym celu posłużylibyśmy się poniższą instrukcją SELECT, zawierającą złączenie krzyżowe:
SELECT
Rozmiar,
Kolor
FROM RozmiaryKoszulek
CROSS JOIN KoloryKoszulek
Jej wynik to:
Rozmiar | Kolor |
Mały | Czerwony |
Mały | Niebieski |
Mały | Zielony |
Mały | Żółty |
Średni | Czerwony |
Średni | Niebieski |
Średni | Zielony |
Średni | Żółty |
Duży | Czerwony |
Duży | Niebieski |
Duży | Zielony |
Duży | Żółty |
Jak widać, wskutek użycia w zapytaniu złączenia krzyżowego otrzymaliśmy zestaw wszystkich możliwych kombinacji wartości znajdujących się w wierszach pochodzących z obu tabel. Zauważ ponadto, że w definicji tego złączenia nie ma słowa kluczowego ON. Powodem tego jest brak określonego związku między tabelami wymienionymi w naszej instrukcji. Nie mają one wspólnej kolumny, która mogłaby posłużyć do złączenia. Dane w nich zawarte są od siebie niezależne.
Co ciekawe, złączenie krzyżowe można zapisać także, stosując znany nam już z poprzedniego rozdziału format, mianowicie z pominięciem w tym przypadku słowa kluczowego CROSS JOIN. Wystarczy wymienić w klauzuli FROM, po przecinku, nazwy tabel będących przedmiotem tego rodzaju złączenia. Po uruchomieniu poniższej instrukcji SELECT otrzymamy zatem ten sam wynik co w przypadku użycia klauzuli CROSS JOIN:
SELECT
Rozmiar,
Kolor
FROM RozmiaryKoszulek, KoloryKoszulek
Powyższy przykład zastosowania złączenia krzyżowego dotyczy sytuacji, która rzadko ma miejsce w realnym świecie. Przejdźmy zatem do drugiego przykładu, prezentującego dość powszechne wykorzystanie omawianego przez nas typu złączenia. Wyobraźmy sobie, że mamy tabelę, w której znajduje się tylko jeden wiersz zawierający istotne dla nas, choć niepełne,
informacje. Ponieważ jest to pojedynczy wiersz, możemy dokonać złączenia krzyżowego naszej tabeli z inną tabelą, dzięki czemu w wyniku otrzymamy również tylko jeden wiersz. Pokażmy to zatem na przykładzie i skorzystajmy z tabeli KluczoweDaty, w której
znalazły się informacje dotyczące dat istotnych z punktu widzenia przedsiębiorstwa:
OstatniaDataPrzetwarzania | BieżącyRokPodatkowy | BieżącyKwartałPodatkowy |
2016-09-15 | 2016 | Q3 |
W naszym przykładzie chcemy wyświetlić dane z tabeli Zamówienia, jednak interesować nas będą wyłącznie te wiersze, w przypadku których data zamówienia jest taka jak wartość w kolumnie OstatniaDataPrzetwarzania z tabeli KluczoweDaty. Warto nadmienić, że ostatnia data przetwarzania często się zmienia. Wskazuje ona bowiem moment, w którym w systemie miało miejsce ostatnie przetwarzanie określonego zestawu danych. Mogą się jednak zdarzyć pewne opóźnienia, wskutek czego data ta nie będzie najbardziej aktualna. Poniżej znajduje się instrukcja SELECT ze złączeniem krzyżowym, za pomocą której uzyskamy interesujące nas informacje:
SELECT
IDZamówienia AS 'ID zamówienia',
DataZamówienia AS 'Data zamówienia',
KwotaZamówienia AS 'Kwota zamówienia'
FROM Zamówienia
CROSS JOIN KluczoweDaty
WHERE DataZamówienia = OstatniaDataPrzetwarzania
Jej wynik jest następujący:
ID zamówienia | Data zamówienia | Kwota zamówienia |
4 | 2016-09-15 | 20,00 |
Tym samym otrzymaliśmy tylko jeden wiersz z danymi z tabeli Zamówienia. Stało się tak, ponieważ w kryteriach selekcji odnieśliśmy się do wartości znajdującej się w kolumnie Ostatnia DataPrzetwarzania. Ponieważ w tabeli KluczoweDaty znajduje się tylko jeden wiersz, wskutek zastosowania złączenia krzyżowego otrzymaliśmy również tylko jeden rekord, nie zaś zwielokrotnioną ich liczbę. Użycie klauzuli CROSS JOIN nie miało zatem wpływu na liczbę wierszy wyświetlanych w wyniku.
Język SQL. Przyjazny podręcznik. Wydanie II Autor: Larry Rockoff Wydawnictwo: Helion