Jeśli dobrze rozumiem, co RIGHT JOIN
:
SELECT Persons.*, Orders.*
FROM Orders
RIGHT JOIN Persons ON Orders.PersonID = Persons.ID
można wyrazić jako LEFT JOIN
:
SELECT Persons.*, Orders.*
FROM Persons
LEFT JOIN Orders ON Persons.ID = Orders.PersonID
Moja osobista opinia jest taka, że intencja tego oświadczenia:
- Najpierw zdobądź
Persons
- Następnie rozwiń / powtórz w
Persons
razie potrzeby, aby dopasowaćOrders
jest lepiej wyrażony przez kolejność Persons LEFT JOIN Orders
niż przez odwrotną kolejność Orders RIGHT JOIN Persons
(i nigdy nie używam RIGHT JOIN
w rezultacie).
Czy są jakieś sytuacje, w których RIGHT JOIN
preferowany jest a ? Lub czy są jakieś przypadki użycia, w których RIGHT JOIN
można zrobić coś, LEFT JOIN
czego nie można?
database-design
sql
relational-database
Zev Spitz
źródło
źródło
RIGHT JOIN
jest to zalecane lub bardziej powszechne. Jeśli to twoja przesłanka, jest niepoprawna. Nie mogę sobie wyobrazić czasu, w którym kiedykolwiek widziałem właściwe sprzężenie użyte w kodzie ani w przykładach. To jestJOIN
lubLEFT OUTER JOIN
. W rzadkich przypadkach możesz zobaczyćFULL OUTER JOIN
.Odpowiedzi:
To zależy od tego, jaki wymóg starasz się spełnić.
To nie to samo, co powiedzieć: „daj wszystkim osobom i odpowiadającym im rozkazom”, że „Chcę wszystkich rozkazów z ich odpowiednimi osobami” , szczególnie jeśli zamierzasz
is null
przynieść wiersze bez odpowiadającego im dopasowania. To właśnie nazywam „dominującą tabelą”, czyli tabelą, z której chcę pobierać wiersze, niezależnie od tego, że po drugiej stronie złączenia nie ma odpowiedniego wiersza.Spójrz na te obrazy, a zauważysz, że nie są takie same:
Źródłem obrazu jest ten znakomity artykuł .
Ale masz rację, że oba wymagania można spełnić, łącząc albo odwracając kolejność tabel w złączeniu.
Sądzę jednak, że dla zachodnich ludzi przyzwyczajonych do pisania od lewej do prawej bardziej naturalnie jest stosować lewe łączenia nad prawymi złączeniami , ponieważ widzimy, że chcemy, aby sprzężenia były w tym samym kierunku lub w tej samej kolejności co
select
kolumny ed.Możliwym powodem preferowania właściwego łączenia jest to, że w twojej kulturze piszesz od prawej do lewej (jak w arabskim lub hebrajskim systemie pisania) i zwykle myślisz w ten sposób, co oznacza, że być może w twoim mózgu informacje tekstowe przepływają od prawej do lewej .
Niektórzy lingwiści uważają, że Twój język wpływa na twój sposób myślenia: https://www.edge.org/conversation/lera_boroditsky-how-does-our-language-shape-the-way-we-think
źródło
LEFT JOIN
bardziej naturalny.Nie ma nic (o czym wiem), co można zrobić z prawym złączeniem, czego nie można zrobić z lewym złączeniem. Ale czasami składnia z lewymi złączeniami jest brzydsza. Powiedzmy, że masz następujące tabele:
Powiedzmy, że musisz uzyskać listę wszystkich osób w bazie danych i wszystkich ich zamówień ze specjalnymi szczegółami zamówienia (powiemy, że nie wszystkie zamówienia mają specjalne szczegóły zamówienia). Więc zwykle wykonujesz lewe łączenie od ludzi do zamówień. Ale musisz dołączyć w szczegółach specjalnych zamówień. Jeśli użyjesz tam połączenia wewnętrznego, to skutecznie sprawi, że lewe połączenie od ludzi zamieni się w połączenie wewnętrzne. IE: to jest to, co chcesz zrobić, ale nie działa (wykluczy to każdego, kto nie ma specjalnego zamówienia):
Więc możesz przepisać to tak:
Nie do końca jasne (zakładając brak komentarzy), ale spełnia swoje zadanie. Jeśli jest to coś więcej niż jednorazowe (tj. Coś, co kiedyś będzie musiało wrócić i utrzymywać), użycie odpowiedniego łączenia może wyjaśnić, co było celem.
Co jest nieco bardziej zwięzłe i jasne (ale tylko jeśli ktokolwiek to czyta, rozumie właściwe dołączenia). Zauważ, że można to napisać przy lewych złączeniach, ale wymaga to zagnieżdżenia (z którym prawdopodobnie mniej osób jest zaznajomionych niż prawe).
W tym momencie jest to wybór tego, co jest najbardziej zrozumiałe i co zrozumie większość ludzi (czy wiesz, jak korzystać z tej składni, jeśli nie wiesz, że nazywa się to łączeniem zagnieżdżonym?).
Krótko mówiąc, nie potrzebujesz dokładnie odpowiednich połączeń, ale mogą one ułatwić czytanie.
źródło
SELECT p.*, o.*, d.* FROM Persons p LEFT JOIN Orders o ON o.CustomerID = p.ID LEFT JOIN SpecialOrders d ON o.Id = d.OrderID
.Widziałem PRAWE DOŁĄCZENIE używane do celów replikacji / scalania. Powiedzmy, że mam dwie tabele A i B. A jest po lewej stronie, a B po prawej. Powiedzmy, że chciałem zreplikować dane między tymi dwiema tabelami, aby były równoważne.
Gdybym chciał pokazać wszystkie dane, które były w A, ale nie w B, byłoby to połączenie LEWE. Gdybym chciał pokazać wszystkie dane w B, które nie były w A, PRAWO dołączyłbym.
Czasami LEWO i PRAWO przydają się przy scalaniu i replikacji danych, aby zachować perspektywę.
Poza tym nie widzę żadnego innego powodu, aby używać PRAWEGO połączenia, ponieważ wszystkie PRAWE sprzężenia można przekształcić w PRAWE sprzężenia lub odwrotnie, wszystkie PRAWE sprzężenia można przekonwertować na PRAWE sprzężenia w zależności od tego, w jaki sposób tabele są uporządkowane lub wizualizowane. Byłoby to więc kwestia preferencji w innych przypadkach.
Oto ładny link do wizualizacji połączeń SQL.
http://www.codeproject.com/Articles/33052/Visual-Representation-of-SQL-Joins
źródło
lewe złączenie nie jest przeciwieństwem złączenia prawego, sprawdź następujący przypadek, który daje różne wyniki
tabele b anc c są zawsze połączone wewnętrznie, ale w pierwszym a jest pozostawione połączone z innymi, a w drugim a jest połączone prawym
lewy łączenie nie zwraca wierszy, a prawy łączenie zwraca wiersz
źródło
Nigdy nie ma powodu, aby preferować
RIGHT JOIN
iLEFT JOIN
jest o wiele jaśniejsze:ponieważ pozwala natychmiast zobaczyć, która tabela jest sprawdzana. Natomiast z
RIGHT JOIN
:pierwsza tabela jest zapisana po
JOIN
.Z mojego doświadczenia nigdy nie widziałem
RIGHT JOIN
.źródło
RIGHT JOIN
? .