Jak używać mysql JOIN bez warunku ON?

106

Czy można napisać zapytanie typu join bez ONinstrukcji? i jak te połączenia się różnią LEFT JOIN, RIGHT JOIN.

Alexander T.
źródło
1
Ponieważ ONklauzula mówi serwerowi, w jaki sposób tabele są powiązane, nie. Jeśli wszystkie twoje różne typy sprzężeń dają ten sam wynik, robisz to w jakiś sposób źle, a dodanie kodu może pomóc nam wykryć twój problem. W międzyczasie udaj się na blog Jeffa Atwooda, aby uzyskać 2-minutowe wprowadzenie do różnych typów dołączania.
fvu

Odpowiedzi:

154

Dokumentacja MySQL obejmuje ten temat.

Oto streszczenie. Podczas używania joinlub inner joinThe onwarunek jest opcjonalny. Różni się to od standardu ANSI i różni się od prawie każdej innej bazy danych. Efekt to cross join. Podobnie możesz użyć onklauzuli with cross join, która również różni się od standardowego SQL.

Sprzężenie krzyżowe tworzy iloczyn kartezjański - to znaczy każdą możliwą kombinację 1 wiersza z pierwszej tabeli i 1 wiersza z drugiej. Połączenie krzyżowe dla tabeli z trzema wierszami („a”, „b” i „c”) oraz tabeli z czterema wierszami (powiedzmy 1, 2, 3, 4) miałoby 12 wierszy.

W praktyce, jeśli chcesz wykonać sprzężenie krzyżowe, użyj cross join:

from A cross join B

jest znacznie lepszy niż:

from A, B

i:

from A join B -- with no on clause

onKlauzula jest wymagane przez prawo lub w lewo sprzężenie zewnętrzne, więc dyskusja nie ma znaczenia dla nich.

Jeśli chcesz zrozumieć różne typy sprzężeń, musisz trochę przestudiować relacyjne bazy danych. Stackoverflow nie jest odpowiednim miejscem na ten poziom dyskusji.

Gordon Linoff
źródło
1
Nigdy nie słyszałem o połączeniu krzyżowym ani nie potrzebowałem go ... aż do dzisiaj!
goneos
11

Zobacz przykład w http://www.sitepoint.com/understanding-sql-joins-mysql-database/

Możesz użyć „USING” zamiast „ON”, jak w zapytaniu

SELECT * FROM table1 LEFT JOIN table2 USING (id);
Manu
źródło
3
Dla dodatkowego wyjaśnienia, łącząca kolumna w obu tabelach musi mieć identyczną nazwę dla USING to work
rmirabelle