2009-03-27 19 views
35

Używam INNER JOIN i LEFT OUTER DOŁĄCZY przez cały czas. Jednak nigdy nie potrzebuję RIGHT OUTER Joachs.Czy ktoś używa Right Outer Joins?

Widziałem wiele nieprzyjemnych automatycznie generowanych instrukcji SQL, które używają prawych połączeń, ale dla mnie ten kod jest niemożliwy do opanowania. Zawsze muszę przepisać go za pomocą wewnętrznych i lewych złączeń, aby wykonać z niego głowy lub końce.

Czy ktoś faktycznie pisze zapytania używając Prawych sprzężeń?

+0

Powiązane: http: // s tackoverflow.com/questions/436345/when-or-why-would-you-use-a-right-outer-join-instead-of-left – Thilo

Odpowiedz

25

To zależy od tego, po której stronie łączenia umieścisz każdy stół.

Jeśli chcesz zwrócić wszystkie wiersze z lewej tabeli, nawet jeśli nie ma odpowiedników w prawej tabeli ... używaj lewostronnego łączenia.

Jeśli chcesz zwrócić wszystkie wiersze z prawej tabeli, nawet jeśli nie ma żadnych dopasowań w lewej tabeli, użyj prawego łączenia.

Co ciekawe, rzadko używałem prawych połączeń.

+11

Zawsze uważam, że bardziej logiczne jest rozpoczynanie od tabeli zawierającej wszystkie elementy, które nie są osierocone, więc zawsze używam LEFT JOIN. Zastanawiam się, czy to coś kulturalnego? –

+5

+1, lewe i prawe połączenia zewnętrzne są dokładnie takie same tylko przeciwnie. –

+1

@MatthieuF: Może jest kulturalny. Używanie prawego łączenia sprawia, że ​​robisz coś w odwrotny sposób. Przychodzi bez myślenia, przynajmniej dla mnie, aby zawsze układać moje sprzężenia w taki sposób, aby (jeśli to konieczne) pozostawił złączenie pasujące do sytuacji. Nie wiem dlaczego? :-) – Petros

6

Nie, nie robię tego z prostego powodu, że mogę wykonać wszystko z wewnętrznym lub lewym złączeniem.

9

Zazwyczaj używa się DOŁĄCZ DO ZEWNĄTRZ, aby znaleźć elementy osierocone w innych tabelach.

+0

Czy możesz podać więcej szczegółów? – Shabbyrobe

+0

Sprawdź ten artykuł. http://www.devx.com/dbzone/Article/17403/0/page/5 –

+17

Uważam, że ta odpowiedź sprawia, że ​​prawe sprzężenia brzmią wyjątkowo, gdy nie są. Lewe i prawe połączenia zewnętrzne są swoimi lustrzanymi odbiciami - zarówno przydatnymi do znajdowania osieroconych przedmiotów. Wybór, którego użyć, polega po prostu na tym, z której tabeli chcesz otrzymać wszystkie wiersze, nawet jeśli nie ma żadnych dopasowań. –

1

Nasza standardowa praktyka polega na pisaniu wszystkiego, jeśli to możliwe, w kategoriach LEWEGO DOŁĄCZENIA. Od czasu do czasu używaliśmy FULL OUTER JOINs, jeśli potrzebowaliśmy, ale nigdy PRAWEJ DOŁĄCZY.

2

Jedyny przypadek, w którym używam prawostronnego sprzężenia zewnętrznego, jest wtedy, gdy pracuję nad istniejącym zapytaniem i trzeba to zmienić (zwykle z wewnętrznego). Mógłbym odwrócić połączenie i sprawić, że będzie lewy i prawdopodobnie będzie dobrze, ale staram się zmniejszyć ilość rzeczy, które zmieniam, kiedy modyfikuję kod.

2

Używam tylko lewy, ale pozwól mi powiedzieć, że są naprawdę takie same w zależności od tego, w jaki sposób zamówić rzeczy. Pracowałem z niektórymi ludźmi, którzy używali tylko słusznie, ponieważ budowali zapytania od środka i lubili trzymać swoje główne rzeczy na samym dole, więc w ich umyśle sensowne było używanie tylko prawej.

tj.

Got główną rzeczą tutaj

potrzebują więcej śmieci

Więcej Junk prawo sprzężenia zewnętrznego Main Stuff

Wolę robić rzeczy następnie główny śmieci ... więc lewe prace zewnętrzne dla mnie.

Więc cokolwiek unosi Twoją łódź.

1

Możesz zrobić to samo, używając lewych lub prawych połączeń. Ogólnie większość ludzi myśli w kategoriach LEWEGO sprzężenia prawdopodobnie dlatego, że czytamy od lewej do prawej. To naprawdę sprowadza się do bycia konsekwentnym. Twój zespół powinien skupić się na użyciu lewych lub prawych połączeń, a nie obu, ponieważ są one w zasadzie dokładnie tymi samymi rzeczami, napisane inaczej.

1

Rzadko, jak stwierdzono, zazwyczaj można zmienić kolejność i użyć lewego łączenia. Oczywiście naturalnie zamawiam dane, więc lewe łączenia działają, by uzyskać potrzebne dane. Myślę, że to samo można powiedzieć o pełnych połączeniach zewnętrznych i krzyżowych, większość ludzi ma tendencję do trzymania się z dala od nich.

24

Aby podać jeden przykład, gdzie może być użyteczny RIGHT JOIN.

Załóżmy, że istnieją trzy tabele dla osób, zwierząt i akcesoriów dla zwierząt. Ludzie mogą ewentualnie mieć zwierzęta i te zwierzaki mogą ewentualnie mieć akcesoriów

CREATE TABLE Persons 
    (
    PersonName VARCHAR(10) PRIMARY KEY 
); 

INSERT INTO Persons 
VALUES  ('Alice'), 
      ('Bob'), 
      ('Charles'); 

CREATE TABLE Pets 
    (
    PetName VARCHAR(10) PRIMARY KEY, 
    PersonName VARCHAR(10) 
); 

INSERT INTO Pets 
VALUES  ('Rover', 
      'Alice'), 
      ('Lassie', 
      'Alice'), 
      ('Fifi', 
      'Charles'); 

CREATE TABLE PetAccessories 
    (
    AccessoryName VARCHAR(10) PRIMARY KEY, 
    PetName  VARCHAR(10) 
); 

INSERT INTO PetAccessories 
VALUES  ('Ball', 'Rover'), 
      ('Bone', 'Rover'), 
      ('Mouse','Fifi'); 

Jeśli wymogiem jest, aby uzyskać listę wszystkich ludzi, niezależnie od tego, czy ich właścicielem zwierzaka oraz informacje o wszelkich czworonogów ich właścicielem, który również akcesoria wynik .

Ten nie działa (wyłączając Bob)

SELECT P.PersonName, 
     Pt.PetName, 
     Pa.AccessoryName 
FROM Persons P 
     LEFT JOIN Pets Pt 
     ON P.PersonName = Pt.PersonName 
     INNER JOIN PetAccessories Pa 
     ON Pt.PetName = Pa.PetName; 

Ten nie działa (Zawiera Lassie)

SELECT P.PersonName, 
     Pt.PetName, 
     Pa.AccessoryName 
FROM Persons P 
     LEFT JOIN Pets Pt 
     ON P.PersonName = Pt.PersonName 
     LEFT JOIN PetAccessories Pa 
     ON Pt.PetName = Pa.PetName; 

Ten działa (ale składnia jest znacznie mniej powszechnie rozumiane, ponieważ wymaga dwóch kolejno następujących po sobie klauzul, aby osiągnąć pożądaną logiczną kolejność łączyć)

SELECT P.PersonName, 
     Pt.PetName, 
     Pa.AccessoryName 
FROM Persons P 
     LEFT JOIN Pets Pt 
        INNER JOIN PetAccessories Pa 
        ON Pt.PetName = Pa.PetName 
     ON P.PersonName = Pt.PersonName; 

W sumie chyba najłatwiej użyć RIGHT JOIN

SELECT P.PersonName, 
     Pt.PetName, 
     Pa.AccessoryName 
FROM Pets Pt 
     JOIN PetAccessories Pa 
     ON Pt.PetName = Pa.PetName 
     RIGHT JOIN Persons P 
     ON P.PersonName = Pt.PersonName; 

choć jeśli zdeterminowany, aby uniknąć tego Innym rozwiązaniem byłoby wprowadzenie tabeli pochodnych, które mogą być pozostawione dołączył do

SELECT P.PersonName, 
     T.PetName, 
     T.AccessoryName 
FROM Persons P 
     LEFT JOIN (SELECT Pt.PetName, 
         Pa.AccessoryName, 
         Pt.PersonName 
        FROM Pets Pt 
         JOIN PetAccessories Pa 
          ON Pt.PetName = Pa.PetName) T 
     ON T.PersonName = P.PersonName; 

SQL Fiddles: MySQL, PostgreSQL, SQL Server

+0

Jeśli nie rozumiesz, dlaczego biedny Bob został wykluczony, pomogło mi to: http: // weblogs.sqlteam.com/jeffs/archive/2007/10/11/mixing-inner-outer-joins-sql.aspx – Luke

+0

@Luke - Zbiegiem okoliczności, że obaj użyliśmy przykładu "zwierzątka"! –

Powiązane problemy