Jaka jest różnica między CROSS JOIN
i INNER JOIN
?
CROSS DOŁĄCZ:
SELECT
Movies.CustomerID, Movies.Movie, Customers.Age,
Customers.Gender, Customers.[Education Level],
Customers.[Internet Connection], Customers.[Marital Status],
FROM
Customers
CROSS JOIN
Movies
WEWNĘTRZNE DOŁĄCZ:
SELECT
Movies.CustomerID, Movies.Movie, Customers.Age,
Customers.Gender, Customers.[Education Level],
Customers.[Internet Connection], Customers.[Marital Status]
FROM
Customers
INNER JOIN
Movies ON Customers.CustomerID = Movies.CustomerID
Który z nich jest lepszy i dlaczego miałbym używać jednego?
sql
sql-server
sql-server-2008
tsql
cross-join
PriceCheaperton
źródło
źródło
CROSS JOIN
da w wyniku wszystkie możliwe kombinacje tabel. np. Tabela 1 ze 100 wierszami i Tabela 2 ze 100 wierszami da 10000 rekordów.x CROSS JOIN y
jestx INNER JOIN y ON 1=1
Odpowiedzi:
Łączenie krzyżowe nie łączy wierszy, jeśli masz 100 wierszy w każdej tabeli z dopasowaniem 1 do 1, otrzymasz 10.000 wyników, Innerjoin zwróci tylko 100 wierszy w tej samej sytuacji.
Te dwa przykłady zwrócą ten sam wynik:
Łączenie krzyżowe
Połączenie wewnętrzne
Użyj ostatniej metody
źródło
select * from table1 cross join table2 where table1.id = table2.fk_id
jakoselect * from table1, table2 where table1.id = table2.fk_id
(zastępująccross join
a,
)Oto najlepszy przykład łączenia krzyżowego i wewnętrznego.
Rozważ poniższe tabele
STÓŁ :
Teacher
STÓŁ :
Student
1. WEWNĘTRZNE DOŁĄCZENIE
Sprzężenie wewnętrzne wybiera wiersze, które spełniają wymagania obu tabeli .
Weź pod uwagę, że musimy znaleźć nauczycieli, którzy są nauczycielami klasowymi i odpowiadającymi im uczniami. W takim przypadku musimy złożyć wniosek
JOIN
lubINNER JOIN
i będziemyPytanie
Wynik
2. CROSS JOIN
Łączenie krzyżowe wybiera wszystkie wiersze z pierwszej tabeli i wszystkie wiersze z drugiej tabeli i przedstawia jako iloczyn kartezjański, tj. Ze wszystkimi możliwościami
Rozważ, że musimy znaleźć wszystkich nauczycieli w szkole i uczniów niezależnie od nauczycieli klasowych, musimy złożyć wniosek
CROSS JOIN
.Pytanie
Wynik
źródło
Cross Join
myślisz, że nie zwraca wszystkich wierszy, chyba żeWhere
podano klauzulę? Z twoich komentarzy wynika, że początkujący ma większe szanse na to, że się pomyli !!! @philipxyCROSS JOIN = (INNER) JOIN = przecinek („,”)
TL; DR Jedyną różnicą między SQL CROSS JOIN, (INNER) JOIN i przecinkiem („,”) (poza przecinkiem o niższym priorytecie dla kolejności oceny) jest to, że (INNER) JOIN ma ON, podczas gdy CROSS JOIN i przecinek nie.
Produkty pośrednie
Wszystkie trzy tworzą pośredni, konceptualny produkt „kartezjański” w stylu SQL, nazywany łączeniem krzyżowym wszystkich możliwych kombinacji wiersza z każdej tabeli. Jest ON i / lub GDZIE, które zmniejszają liczbę wierszy. SQL Fiddle
Standard SQL definiuje <comma> za pośrednictwem produktu (7.5 1.b.ii), <łączenie krzyżowe> przez <comma> (7.7 1.a) i JOIN ON <warunek wyszukiwania> przez <comma> plus WHERE (7.7 1.b ).
Jak podaje Wikipedia:
W przypadku ZEWNĘTRZNYCH JOIN i używania opcji ON vs WHERE w nich zobacz Warunki w LEFT JOIN (OUTER JOIN) vs INNER JOIN .
Po co porównywać kolumny między tabelami?
Gdy nie ma zduplikowanych wierszy:
Każda tabela zawiera wiersze, które składają się na prawdziwe stwierdzenie z określonego szablonu instrukcji wypełniania [nazwanych] pustych miejsc. (To sprawia, że prawdziwa propozycja from-- spełnia -A pewną (charakterystyczny) predykat ).
Tabela podstawowa zawiera wiersze, które zawierają prawdziwe oświadczenie z szablonu instrukcji podanego przez DBA:
Produkt pośredni sprzężenia zawiera wiersze, które tworzą prawdziwe stwierdzenie z AND z szablonów argumentów:
ON & WHERE warunki są wstawiane AND, aby dać kolejny szablon. Wartością są ponownie wiersze, które spełniają wymagania tego szablonu:
W szczególności porównanie kolumn dla równości (SQL) między tabelami oznacza, że wiersze zachowane z produktu z części szablonu połączonych tabel mają tę samą (inną niż NULL) wartość dla tych kolumn. To po prostu przypadek, że wiele wierszy jest zwykle usuwanych przez porównania równości między tabelami - konieczne i wystarczające jest scharakteryzowanie żądanych wierszy.
Po prostu napisz SQL dla szablonu dla żądanych wierszy!
Co do znaczenia zapytań (i tabel a warunków) zobacz:
Jak uzyskać pasujące dane z innej tabeli SQL dla dwóch różnych kolumn: Inner Join i / lub Union?
Czy jest jakaś praktyczna zasada konstruowania zapytania SQL na podstawie opisu czytelnego dla człowieka?
Przeciążanie połączenia krzyżowego
Niestety, termin „łączenie krzyżowe” jest używany do:
Te różne znaczenia zostają zmieszane. (Np. Jak w innych odpowiedziach i komentarzach tutaj.)
Używanie CROSS JOIN vs (INNER) JOIN vs comma
Wspólna konwencja to:
Zwykle również warunki, które nie znajdują się na parach tabel, są przechowywane dla GDZIE. Ale może być konieczne umieszczenie ich w (n INNER) JOIN ON, aby uzyskać odpowiednie wiersze dla argumentu DOŁĄCZENIA PRAWEGO, LEWEGO lub PEŁNEGO (ZEWNĘTRZNEGO).
Re „Nie używaj przecinka” Mieszanie przecinka z jawnym JOIN może wprowadzać w błąd, ponieważ przecinek ma niższy priorytet. Ale biorąc pod uwagę rolę produktu pośredniego w znaczeniu CROSS JOIN, (INNER) JOIN i przecinka, argumenty za powyższą konwencją w ogóle go nie używają są niepewne. CROSS JOIN lub przecinek jest podobny do (INNER) JOIN, który ma PRAWDA. Iloczyn pośredni, ON i WHERE, wszystkie wprowadzają AND w odpowiednim predykacie. Jednak w innym przypadku można pomyśleć o INNER JOIN ON - powiedzmy, generowaniu wiersza wyjściowego tylko wtedy, gdy znajduje się para wierszy wejściowych, które spełniają warunek ON - mimo to zwraca wiersze sprzężenia krzyżowego, które spełniają warunek. Jedynym powodem, dla którego ON musiał uzupełniać przecinek w SQL, było pisanie OUTERDOŁĄCZA. Oczywiście wyrażenie powinno jasno określać swoje znaczenie; ale to, co jest jasne, zależy od tego, jakie rzeczy mają oznaczać.
Diagramy Re Venna Diagram Venna z dwoma przecinającymi się okręgami może zilustrować różnicę między wierszami wyjściowymi dla WEWNĘTRZNYCH, W LEWO, PRAWO i PEŁNYCH SPRZĘŻEŃ dla tego samego wejścia. A kiedy ON jest bezwarunkowo PRAWDA, wynik INNER JOIN jest taki sam jak CROSS JOIN. Może również zilustrować wiersze wejściowe i wyjściowe dla INTERSECT, UNION & EXCEPT. A gdy oba wejścia mają te same kolumny, wynik INTERSECT jest taki sam, jak dla standardowego SQL NATURAL JOIN, a wynik EXCEPT jest taki sam, jak dla niektórych idiomów obejmujących LEFT & RIGHT JOIN. Ale nie ilustruje, jak ogólnie działa funkcja (INNER) JOIN. Na pierwszy rzut oka wydaje się to prawdopodobne . Może identyfikować części danych wejściowych i / lub wyjściowych dlaspecjalne przypadki ON, PK (klucze podstawowe), FK (klucze obce) i / lub SELECT. Wszystko, co musisz zrobić, aby to zobaczyć, to określić, jakie dokładnie są elementy zestawów reprezentowanych przez koła . (Które niejasne prezentacje nigdy nie wyjaśniają.) (Pamiętaj, że generalnie w przypadku złączeń wiersze wyjściowe mają inne nagłówki niż wiersze wejściowe . A tabele SQL to worki, a nie zestawy wierszy z wartościami NULL ).
źródło
CROSS JOIN
. Zastanawiam się, jak często ktoś przychodzi do SQL, znając już produkt kartezjański, ale nie może tego zrozumiećCROSS JOIN
.Połączenie wewnętrzne
Sprzężenie, które wyświetla tylko te wiersze, które są zgodne w obu połączonych tabelach, jest znane jako sprzężenie wewnętrzne. Jest to domyślne łączenie w zapytaniu i projektancie widoku.
Składnia łączenia wewnętrznego
Łączenie krzyżowe
Sprzężenie krzyżowe, które tworzy iloczyn kartezjański tabel biorących udział w sprzężeniu. Rozmiar iloczynu kartezjańskiego to liczba wierszy w pierwszej tabeli pomnożona przez liczbę wierszy w drugiej tabeli.
Składnia połączenia krzyżowego
Lub możemy napisać to również w inny sposób
Teraz sprawdź poniższe zapytanie dotyczące łączenia krzyżowego
Przykład
Lub
źródło
Pamiętaj, że jeśli dodana jest klauzula WHERE, sprzężenie krzyżowe zachowuje się jak sprzężenie wewnętrzne. Na przykład następujące zapytania języka Transact-SQL dają ten sam zestaw wyników. Zobacz http://technet.microsoft.com/en-us/library/ms190690(v=sql.105).aspx
źródło
CROSS JOIN
Jak wyjaśniłem w tym artykule , CROSS JOIN ma na celu wygenerowanie produktu kartezjańskiego.
Iloczyn kartezjański przyjmuje dwa zbiory A i B i generuje wszystkie możliwe permutacje par rekordów z dwóch podanych zestawów danych.
Na przykład zakładając, że masz następujące
ranks
isuits
tabele bazy danych:A
ranks
ma następujące wiersze:Chociaż
suits
tabela zawiera następujące rekordy:Jako zapytanie CROSS JOIN, takie jak następujące:
wygeneruje wszystkie możliwe permutacje
ranks
isuites
pary:WEWNĘTRZNE DOŁĄCZENIE
Z drugiej strony INNER JOIN nie zwraca iloczynu kartezjańskiego dwóch łączących się zestawów danych.
Zamiast tego funkcja INNER JOIN pobiera wszystkie elementy z tabeli po lewej stronie i dopasowuje je do rekordów w tabeli po prawej stronie, tak aby:
Na przykład, zakładając, że mamy relację jeden do wielu między tabelami nadrzędnymi
post
i podrzędnymi,post_comment
która wygląda następująco:Teraz, jeśli
post
tabela zawiera następujące rekordy:a
post_comments
tabela zawiera następujące wiersze:Zapytanie INNER JOIN, takie jak następujące:
będzie obejmował wszystkie
post
rekordy wraz ze wszystkimi powiązanymi z nimipost_comments
:Aby uzyskać więcej informacji na temat działania INNER JOIN, zapoznaj się również z tym artykułem .
źródło
SQL Server akceptuje również prostszą notację:
Korzystając z tego prostszego zapisu, nie trzeba przejmować się różnicą między złączeniami wewnętrznymi i krzyżowymi. Zamiast dwóch klauzul „ON” istnieje pojedyncza klauzula „WHERE”, która wykonuje zadanie. Jeśli masz jakiekolwiek trudności z ustaleniem, które klauzule „JOIN” „ON” idą do miejsca, porzuć notację „JOIN” i użyj prostszego powyżej.
To nie jest oszustwo.
źródło
Podczas pisania zapytań z użyciem złączeń wewnętrznych rekordy będą pobierać z obu tabel, jeśli warunek zostanie spełniony w obu tabelach, tj. Dokładne dopasowanie wspólnej kolumny w obu tabelach.
Podczas pisania zapytania przy użyciu sprzężenia krzyżowego wynik jest podobny do iloczynu kartezjańskiego liczby rekordów w obu tabelach. przykład, jeśli tabela1 zawiera 2 rekordy, a tabela2 zawiera 3 rekordy, to wynik zapytania to 2 * 3 = 6 rekordów.
Więc nie używaj łączenia krzyżowego, dopóki tego nie potrzebujesz.
źródło
Łączenie krzyżowe i łączenie wewnętrzne są takie same z tą różnicą, że w sprzężeniu wewnętrznym filtrujemy w sposób logiczny niektóre wyniki iloczynu kartezjańskiego
To na projektowaniu naszych danych decydujemy, że istnieje tylko jeden przypadek pola, którego używamy do łączenia. Łącz tylko łącz krzyżowo łącz obie tabele i otrzymuj tylko linie spełniające specjalne wyrażenie boolowskie.
Zauważ, że jeśli pola, na których robimy nasze połączenia, będą miały wartość null w obu tabelach, przepuścimy filtr. Do nas lub producenta bazy danych należy dodanie dodatkowych reguł w celu uniknięcia lub zezwolenia na zerowanie. Zgodnie z podstawami jest to po prostu łączenie krzyżowe, po którym następuje filtr.
źródło
Sprzężenie wewnętrzne da wynik dopasowanych rekordów między dwiema tabelami, gdzie sprzężenie krzyżowe daje możliwe kombinacje między dwiema tabelami.
źródło
A = {1,5,3,4,6,7,9,8} B = {2,8,5,4,3,6,9}
cross join
działają jak iloczyn kartezjański A ✖ B = {1,2}, {1,8} ..., {5,2}, {5,8}, {5,5} ..... {3,3} ..., {6,6} .... {8,9} i zwrócił ten długi zestaw wyników ..podczas przetwarzania
inner join
dokonanego za pomocą iloczynu kartezjańskiego i wybierz pasujące pary. jeśli myślisz, że te uporządkowane pary są dwoma kluczami głównymi tabeli i szukają klauzuli A = B, toinner join
wybierz {5,5}, {4,4}, {6,6} , {9,9} i zwróciliśmy zapytaną kolumnę w klauzuli select związanej z tymi identyfikatorami.jeśli
cross join
na a = b, to wynik jest taki sam jak zestaw wynikówinner join
. w takim przypadku również użyjinner join
.źródło
To zależy od oczekiwanej wydajności.
Sprzężenie krzyżowe dopasowuje wszystkie wiersze w jednej tabeli do wszystkich wierszy w innej tabeli. Sprzężenie wewnętrzne pasuje do pola lub pól. Jeśli masz jedną tabelę z 10 wierszami, a drugą z 10 wierszami, dwa połączenia będą się zachowywać inaczej.
W przypadku sprzężenia krzyżowego zostanie zwróconych 100 wierszy i nie będą one ze sobą powiązane, tylko tak zwany iloczyn kartezjański. Sprzężenie wewnętrzne dopasuje rekordy do siebie. Zakładając, że jeden ma klucz podstawowy, a drugi jest kluczem obcym, zwróconych zostanie 10 wierszy.
Łączenie krzyżowe ma ograniczoną użyteczność ogólną, ale istnieje w celu zapewnienia kompletności i opisuje wynik łączenia tabel bez żadnych relacji dodanych do zapytania. Możesz użyć sprzężenia krzyżowego, aby utworzyć listę kombinacji słów lub czegoś podobnego. Z drugiej strony, najczęściej stosowane jest złączenie wewnętrzne.
źródło