Złączenie krzyżowe SQL zwraca iloczyn kartezjański obu tabel. Iloczyn kartezjański oznacza liczbę wierszy obecnych w tabeli 1 pomnożoną przez liczbę wierszy obecnych w tabeli 2. Złączenie krzyżowe nie wymaga żadnej wspólnej kolumny do złączenia dwóch tabel. Zobaczmy wizualną reprezentację złączenia krzyżowego dla lepszego zrozumienia.
Z powyższego zrzutu ekranu można łatwo zrozumieć, że SQL Server złączenie krzyżowe wyświetla iloczyn kartezjański dwóch tabel. Oznacza to, że każdy rekord w tabeli A jest łączony z każdym rekordem w tabeli B
Składnia złączenia krzyżowego
Składnia złączenia krzyżowego w SQL Server jest następująca
-- SQL Server Cross Join SyntaxSELECT Table1.Column(s), Table2.Column(s),FROM Table1 CROSS JOIN Table2 --OR We can Simply Write it asSELECT Table1. Column(s), Table2. Column(s),FROM Table1, Table2
W tym przykładzie złączenia krzyżowego SQL Server używamy dwóch tabel (Pracownik i Dział). Dane obecne w tabeli Employee
Dane obecne w tabeli SQL Server Department to:
SQL Cross Join Select * Przykład
Następujące zapytanie Cross Join wyświetli wszystkie istniejące kolumny w tabelach pracowników & Department
-- SQL Server Cross Join ExampleUSE SQLTESTGOSELECT * FROM CROSS JOIN ;
Jeśli obserwujesz poniższy zrzut ekranu Join, Wyświetlane jest 120 rekordów. Oznacza to, że 15 wierszy z tabeli Employee mnożymy przez 8 wierszy z tabeli Department
UWAGA: Sugeruję wybranie poszczególnych nazw kolumn. Proszę unikać instrukcji SELECT * w złączeniu krzyżowym, aby uniknąć niechcianych kolumn takich jak id, DeptID, id, itp.
Przykład złączenia krzyżowego SQL Select Few Columns
Jak powiedzieliśmy wcześniej, proszę wybrać wymagane kolumny po instrukcji SELECT, aby uniknąć niechcianych kolumn. Poniższe zapytanie wyświetli iloczyn kartezjański kolumn obecnych w tabelach Employee i Department.
-- SQL Server Cross Join ExampleUSE SQLTESTGOSELECT , ,FROM CROSS JOIN
SQL Cross Join Niejednoznaczne kolumny
Powyższe zapytanie Transact będzie działać bezbłędnie jeśli nazwy kolumn w obu tabelach (Pracownik i Dział) są różne jak powyżej. Co się stanie, jeśli nazwy kolumn w obu tabelach będą takie same? Cóż, przy powyższym podejściu, skończy się to błędem.
Pozwól, że pokażę Ci jeden praktyczny przykład. Dodaliśmy id z tabeli department jako dodatkową kolumnę do powyższego zapytania.
-- SQL Server Cross Join ExampleUSE SQLTESTGOSELECT , ,id ,FROM CROSS JOIN
Jak widzisz, wyrzuca błąd: Ambiguous column name id. Jest to spowodowane tym, że kolumna id jest obecna zarówno w tabeli Employee jak i department. A SQL Server nie wie, którą kolumnę chcesz pobrać.
Aby rozwiązać tego typu problemy, zawsze musisz użyć nazwy tabeli przed nazwą kolumny. Poniższe zapytanie Cross Join używa nazwy tabeli ALIAS przed nazwami kolumn. Dzięki takiemu podejściu możemy poinformować serwer, że szukamy kolumny id należącej do tabeli department.
Powyższe zapytanie cross join możemy zapisać jako:
-- SQL Server Cross Join ExampleSELECT Emp. ,Emp. ,Dept.id ,Dept.FROM AS EmpCROSS JOIN AS Dept
Cross Join bez słowa kluczowego Join
Możemy również uniknąć słowa kluczowego CROSS JOIN, aby uzyskać wynik.
-- SQL Server Cross Join ExampleSELECT Emp. AS ,Emp. AS ,Dept. AS FROM AS Emp,CROSS JOIN AS Dept--OR We Can simply Write it asSELECT Emp. AS ,Emp. AS ,Dept. AS FROM AS Emp, AS Dept
SQL Cross Join Where Clause
Klauzulę Where możemy użyć wraz z cross join w celu ograniczenia liczby wierszy zwracanych przez cross join. Tutaj używamy klauzuli WHERE wraz z połączeniem krzyżowym.
-- SQL Server Cross Join ExampleSELECT Emp. AS ,Emp. AS ,Dept. AS FROM AS Emp, AS DeptWHERE Dept. = 'Software Developer'
Cross Join Przykład złączenia krzyżowego Order By Clause
Złączenie krzyżowe pozwala nam na użycie klauzuli Order By Clause w celu zmiany kolejności rekordów.
-- SQL Server Cross Join ExampleSELECT Emp. AS ,Emp. AS ,Dept. AS FROM AS Emp, AS DeptWHERE Dept. = 'Software Developer'