Articles

SQL CROSS JOIN

Posted on

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.

wykres SQL CROSS JOIN

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

Przykład SQL CROSS JOIN

Dane obecne w tabeli SQL Server Department to:

SQL CROSS JOIN

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

SQL CROSS JOIN 3

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 4

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ć.

SQL CROSS JOIN 5

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
SQL CROSS JOIN 6

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 1

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'
SQL CROSS JOIN 2

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'
SQL CROSS JOIN 7

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *