Różnica między złączeniem lewego i prawego łączenia w programie SQL Server


225

Wiem o sprzężeniach w SQL Server.

Na przykład. Istnieją dwie tabele Tabela 1, Tabela 2.

Ich struktury tabel są następujące.

create table Table1 (id int, Name varchar (10))

create table Table2 (id int, Name varchar (10))

Dane z tabeli 1:

    Id     Name     
    -------------
    1      A        
    2      B    

Dane z tabeli 2:

    Id     Name     
    -------------
    1      A        
    2      B 
    3      C

Jeśli wykonam oba poniższe polecenia SQL, oba wyjścia będą takie same

select *
from Table1
  left join Table2 on Table1.id = Table2.id

select *
from Table2
  right join Table1 on Table1.id = Table2.id

W powyższych instrukcjach SQL wyjaśnij różnicę między złączeniem lewej i prawej strony.

Odpowiedzi:


73
Select * from Table1 left join Table2 ...

i

Select * from Table2 right join Table1 ...

są rzeczywiście całkowicie wymienne. Spróbuj jednak Table2 left join Table1(lub jego identycznej pary Table1 right join Table2), aby zobaczyć różnicę. To zapytanie powinno dać ci więcej wierszy, ponieważ Tabela 2 zawiera wiersz o identyfikatorze, którego nie ma w tabeli 1.


17
Dlaczego więc potrzebujemy, RIGHT JOINjeśli tylko możemy osiągnąć pożądany rezultat LEFT JOIN? : P
użytkownik1857492,

1
@SilapAliyev To właściwie bardzo dobre pytanie. Czy ktoś może odpowiedzieć? : D
Ian Chu Te

21
Select * from Table1 left join Table 2zwróci WSZYSTKIE rekordy z tabeli 1 oraz rekordy zbieżne z Tabeli 2. Przeciwnie Select * from Table1 right join Table 2zwróci WSZYSTKIE rekordy z Tabeli 2 i rekordy zbiegów z Tabeli 1. Ma nadzieję, że to pomoże.
Programador Adagal

3
jeśli używasz więcej niż 2 tabel, użycie prawego łączenia może być znaczące i czytelne
ɥʇɹɐʞıɥʇɹɐʞ ouɐɯ

1
@MarkusMeskanen zmieniasz proste zdanie z 7 słów. Kiedy masz 356 wierszy zdanie z wieloma podległościami i musisz zmienić logikę Lewej Prawicy, nie będziesz się zastanawiać, zmieniając ją tylko jednym słowem ...
Programador Adagal

1014

Codeproject ma ten obraz, który wyjaśnia proste podstawy łączenia SQL, zaczerpnięty z: http://www.codeproject.com/KB/database/Visual_SQL_Joins.aspx Wyjaśnienia dotyczące połączeń SQL


64
Nie ma tam zbyt wielu „szczegółów”. Kredyt powinien faktycznie przejść na stronę projektu kodu zamiast do mnie. Ale oczywiście nie mam nic przeciwko uwadze :-)
Daan Timmer

6
@Dan Timmer nie, ty też musisz mieć kredyt! Ponownie pakujesz i odsprzedajesz, aby zaspokoić konkretne i szczególne zapotrzebowanie. Sprzedawcy robią to samo i otrzymują miliardy $$
BKSpurgeon

Wydaje mi się, że możemy wymagać warunku „ORAZ”, w którym klauzula ostatniej cyfry „Zewnętrzne wykluczając DOŁĄCZ”. Wydaje mi się, że zapytanie musi zostać zaktualizowane do WYBIERZ <select_list> FROM Table_A A PEŁNY ZEWNĘTRZNY DOŁĄCZ Table_B B ON A.Key = B.Key WHERE A.Key IS NULL AND B.Key IS NULL
vinsinraw

@ vinsinraw, który nie jest potrzebny. Bo to jest już objęte warunkiem: JOIN Table_B b ON A.Key = B.Key. Warunek OR działa dobrze.
Daan Timmer,

Jest to częste nadużywanie diagramów Venna. Okręgi A i B nie reprezentują tabel A i B, okrąg A to A LEWA DOŁĄCZ B, a cirlce B to A PRAWA JOIN B. Również nie ma znaczenia, jaki jest warunek WŁĄCZENIA, a klucze są nieistotne i GDZIE nie działają co walizka. Zobacz moje komentarze i odpowiedzi na tej stronie iw tej sekcji Diagramy Venna .
philipxy

37

Tabela, z której pobierasz dane, to „LEWA”.
Stolik, do którego dołączasz, jest „PRAWY”.
LEFT JOIN: Zabierz wszystkie przedmioty z lewego stołu ORAZ (tylko) pasujące przedmioty z prawego stołu.
PRAWA DOŁĄCZ: Weź wszystkie przedmioty z prawego stołu ORAZ (tylko) pasujące przedmioty z lewego stołu.
Więc:

Select * from Table1 left join Table2 on Table1.id = Table2.id  

daje:

Id     Name       
-------------  
1      A          
2      B      

ale:

Select * from Table1 right join Table2 on Table1.id = Table2.id

daje:

Id     Name       
-------------  
1      A          
2      B   
3      C  

miałeś rację łącząc tabelę z mniejszą liczbą wierszy na stole z większą liczbą wierszy
ORAZ
ponownie, lewą łącząc tabelę z mniejszą liczbą wierszy na stole z większą liczbą wierszy
Spróbuj:

 If Table1.Rows.Count > Table2.Rows.Count Then  
    ' Left Join  
 Else  
    ' Right Join  
 End If  

22

(WEWNĘTRZNY) DOŁĄCZ: Zwraca rekordy, które mają pasujące wartości w obu tabelach.

DOŁĄCZ DO LEWEGO (ZEWNĘTRZNEGO): Zwraca wszystkie rekordy z lewej tabeli i dopasowane rekordy z prawej tabeli.

DOŁĄCZ DO PRAWEJ (ZEWNĘTRZNEJ): Zwróć wszystkie rekordy z prawej tabeli i dopasowane rekordy z lewej tabeli.

DOŁĄCZ DO PEŁNEJ (ZEWNĘTRZNEJ): Zwraca wszystkie rekordy, gdy występuje dopasowanie w lewej lub prawej tabeli

Załóżmy na przykład, że mamy dwie tabele z następującymi rekordami:

Tabela A

id   firstname   lastname
___________________________
1     Ram         Thapa
2     sam         Koirala
3     abc         xyz
6    sruthy       abc

Tabela B

id2   place
_____________
1      Nepal
2      USA
3      Lumbini
5      Kathmandu

Przyłączenie wewnętrzne

Uwaga: podaje przecięcie dwóch tabel.

Przyłączenie wewnętrzne

Składnia

SELECT column_name FROM table1 INNER JOIN table2 ON table1.column_name = table2.column_name;

Zastosuj go w przykładowej tabeli:

SELECT TableA.firstName,TableA.lastName,TableB.Place FROM TableA INNER JOIN TableB ON TableA.id = TableB.id2;

Wynik będzie:

firstName       lastName       Place
_____________________________________
  Ram         Thapa             Nepal
  sam         Koirala            USA
  abc         xyz              Lumbini

Left Join

Uwaga: da wszystkie wybrane wiersze w tabeli A, a także wszystkie wspólne wybrane wiersze w tabeli B.

Lewy dołącz

SELECT column_name(s) FROM table1 LEFT JOIN table2 ON table1.column_name = table2.column_name;

Zastosuj go w przykładowej tabeli

SELECT TableA.firstName,TableA.lastName,TableB.Place FROM TableA LEFT JOIN TableB ON TableA.id = TableB.id2;

Wynik będzie:

firstName   lastName    Place
______________________________
 Ram         Thapa      Nepal
 sam         Koirala    USA
 abc         xyz        Lumbini
sruthy       abc        Null

Right Join

Uwaga: da wszystkie wybrane wiersze w tabeli B, a także wszystkie wspólne wybrane wiersze w tabeli A.

Right Join

Składnia:

SELECT column_name(s) FROM table1 RIGHT JOIN table2 ON table1.column_name = table2.column_name;

Zastosuj go w tabeli samoli:

SELECT TableA.firstName,TableA.lastName,TableB.Place FROM TableA RIGHT JOIN TableB ON TableA.id = TableB.id2;

Wynik będzie bw:

firstName   lastName     Place
______________________________
Ram         Thapa         Nepal
sam         Koirala       USA
abc         xyz           Lumbini
Null        Null          Kathmandu

Pełne dołączenie

Uwaga: Działa to tak samo jak operacja łączenia, zwróci wszystkie wybrane wartości z obu tabel.

Pełne dołączenie

Składnia:

SELECT column_name(s) FROM table1 FULL OUTER JOIN table2 ON table1.column_name = table2.column_name;

Zastosuj go w swoim samp [le table:

SELECT TableA.firstName,TableA.lastName,TableB.Place FROM TableA FULL JOIN TableB ON TableA.id = TableB.id2;

Wynik będzie:

firstName   lastName    Place
______________________________
 Ram         Thapa      Nepal
 sam         Koirala    USA
 abc         xyz        Lumbini
sruthy       abc        Null
 Null         Null      Kathmandu

Kilka faktów

Dla przyłączeń INNER kolejność nie ma znaczenia

Dla połączeń (LEWY, PRAWY lub PEŁNY) ZEWNĘTRZNY kolejność ma znaczenie

Znajdź więcej na w3schools


12
select fields 
from tableA --left
left join tableB --right
on tableA.key = tableB.key

Tabela w fromtym przykładzie tableAznajduje się po lewej stronie relacji.

tableA <- tableB
[left]------[right]

Jeśli więc chcesz pobrać wszystkie wiersze z lewej tabeli ( tableA), nawet jeśli w prawej tabeli ( tableB) nie ma żadnych dopasowań , użyjesz „lewego łączenia”.

A jeśli chcesz pobrać wszystkie wiersze z prawej tabeli ( tableB), nawet jeśli w lewej tabeli ( tableA) nie ma żadnych dopasowań , użyjesz right join.

Zatem poniższe zapytanie jest równoważne z powyższym.

select fields
from tableB 
right join tableA on tableB.key = tableA.key

10

Wydaje się, że pytanie: „Jeśli mogę przepisać RIGHT OUTER JOINprzy użyciu LEFT OUTER JOINskładni, to dlaczego mają RIGHT OUTER JOINskładnię w ogóle?” Myślę, że odpowiedź na to pytanie jest taka, ponieważ projektanci języka nie chcieli nakładać takich ograniczeń na użytkowników (i myślę, że byliby skrytykowani, gdyby to zrobili), co zmusiłoby użytkowników do zmiany kolejności tabel w FROMklauzuli w niektórych okolicznościach, gdy zmienia się jedynie typ łączenia.


czasami lewe i prawe połączenia zewnętrzne są całkowicie wymienne, prawda?
ア レ ッ ク ス

4
@Alex: w rzeczywistości lewe i prawe połączenia zewnętrzne są zawsze wymienne.
dniu

8

Twoje dwa stwierdzenia są równoważne.

Większość ludzi korzysta tylko LEFT JOINdlatego, że wydaje się bardziej intuicyjna, a jej uniwersalna składnia - nie sądzę, aby wszystkie obsługiwały RDBMS RIGHT JOIN.


„Nie sądzę, aby wszystkie RDBMS obsługiwały PRAWE DOŁĄCZENIE” - jasne, że nie wszystkie RDBMS obsługują SQL. Ale jeśli sugerujesz, że niektóre produkty SQL obsługują, LEFTale nie, RIGHTproszę wskazać, które z nich.
poniedziałek

10
@onedaywhen Na przykład SQLite 3 nie implementuje się RIGHTi FULL OUTER JOIN : sqlite.org/omitted.html
Mac_Cain13

0

Wydaje mi się, że możemy wymagać ANDspełnienia warunku wherez ostatniej cyfry, Outer Excluding JOINaby uzyskać pożądany wynik A Union B Minus A Interaction B. Wydaje mi się, że zapytanie wymaga aktualizacji

SELECT <select_list>
FROM Table_A A
FULL OUTER JOIN Table_B B
ON A.Key = B.Key
WHERE A.Key IS NULL AND B.Key IS NULL

Jeśli użyjemy OR, uzyskamy wszystkie wynikiA Union B


0

wybierz * z lewej Tabeli 1 dołącz do Tabeli 2 na Table1.id = Table2.id

W pierwszym zapytaniu LEFT JOIN porównuje lewostronne stołowego tabela1 do prawostronnej tabeli Table2 .

W którym zostaną pokazane wszystkie właściwości tabeli 1 , podczas gdy w tabeli 2 zostaną pokazane tylko te właściwości, w których warunek się spełni.

wybierz * z Tabeli 2 po prawej dołącz Table1 na Table1.id = Table2.id

W pierwszym zapytaniu prawo przyłączenia porównuje prawostronne stołowego tabela1 do lewostronne tabeli Table2 .

W którym zostaną pokazane wszystkie właściwości tabeli 1 , podczas gdy w tabeli 2 zostaną pokazane tylko te właściwości, w których warunek się spełni.

Oba zapytania dadzą ten sam wynik, ponieważ kolejność deklaracji tabeli w zapytaniu jest różna, tak jak deklarujesz table1 i table2 odpowiednio w lewym i prawym odpowiednio w pierwszym zapytaniu o lewe połączenie , a także deklarujesz table1 i table2 odpowiednio w prawo i lewo odpowiednio w drugim złączeniu prawym pytanie.

To jest powód, dla którego otrzymujesz ten sam wynik w obu zapytaniach. Jeśli więc chcesz uzyskać inny wynik, wykonaj odpowiednio te dwa zapytania,

wybierz * z lewej Tabeli 1 dołącz do Tabeli 2 na Table1.id = Table2.id

wybierz * z Tabeli 1 po prawej dołącz Table2 na Table1.id = Table2.id


0

Select * from Table1 t1 Left Join Table2 t2 on t1.id=t2.id Z definicji: Left Join wybiera wszystkie kolumny wymienione za pomocą słowa kluczowego „select” z tabeli 1 i kolumny z tabeli 2, które spełniają kryteria po słowie kluczowym „on”.

Podobnie z definicji: Right Join zaznacza wszystkie kolumny wymienione za pomocą słowa kluczowego „select” z tabeli 2 oraz kolumny z tabeli 1, które pasują do kryteriów po słowie kluczowym „on”.

Odnosząc się do twojego pytania, identyfikatory w obu tabelach są porównywane ze wszystkimi kolumnami, które należy wrzucić w wynik. Tak więc identyfikatory 1 i 2 są wspólne w obu tabelach, w wyniku czego będziesz mieć cztery kolumny z kolumnami id i nazwami z pierwszej i drugiej tabeli w kolejności.

*select * from Table1 left join Table2 on Table1.id = Table2.id

Powyższe wyrażenie pobiera wszystkie rekordy (wiersze) z tabeli 1 i kolumn, z pasującymi identyfikatorami z tabeli 1 i tabeli 2, z tabeli 2.

select * from Table2 right join Table1 on Table1.id = Table2.id**

Podobnie z powyższego wyrażenia, pobiera wszystkie rekordy (wiersze) z tabeli 1 i kolumn, z pasującymi identyfikatorami z tabeli 1 i tabeli 2, z tabeli 2. (pamiętaj, że jest to prawidłowe połączenie, więc wszystkie kolumny z tabeli 2, a nie z tabeli 1 będą brane pod uwagę).

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.