Różnica między lewym połączeniem A prawym połączeniem w SQL Server [duplikat]

to pytanie ma już odpowiedzi tutaj : Jaka jest różnica między "wewnętrznym połączeniem" a "zewnętrznym połączeniem"? (27 odpowiedzi) Zamknięty 7 miesięcy temu .

Wiem o połączeniach w SQL serverze.

Na przykład. Istnieją dwa stoły Table1, Table2.

Ich struktury tabeli są następujące.

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

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

Table1 dane w następujący sposób:

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

Table2 dane w następujący sposób:

    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

Proszę wyjaśnić różnicę między lewym i prawym Przyłącz się powyższe polecenia SQL.

Author: Morten, 2011-01-17

9 answers

Select * from Table1 left join Table2 ...

I

Select * from Table2 right join Table1 ...
Są 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ć więcej wierszy, ponieważ Table2 zawiera wiersz o id, który nie jest obecny w Table1.
 74
Author: Péter Török,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-17 17:14:47

/ Align = "LEFT" /
/ Align = "RIGHT" / 24 września 2000
LEFT JOIN: pobiera wszystkie elementy z lewej tabeli i (tylko) pasujące elementy z prawej tabeli.
RIGHT JOIN: pobiera wszystkie elementy z prawej tabeli i (tylko) pasujące elementy z lewej tabeli.
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 tabeli z większą liczbą wierszy
Oraz
/ align = "left" / Linear z mniejszą liczbą wierszy w tabeli z większą liczbą wierszy
Try:

 If Table1.Rows.Count > Table2.Rows.Count Then  
    ' Left Join  
 Else  
    ' Right Join  
 End If  
 37
Author: vbole,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-22 14:01:26

(wewnętrzne) JOIN: zwraca rekordy, które mają pasujące wartości w obu tabelach.

LEFT (OUTER) JOIN: zwraca wszystkie rekordy z lewej tabeli i dopasowane rekordy z prawej tabeli.

RIGHT (OUTER) JOIN: zwraca wszystkie rekordy z prawej tabeli i dopasowane rekordy z lewej tabeli.

FULL (OUTER) JOIN: zwraca wszystkie rekordy, gdy jest dopasowanie w lewej lub prawej tabeli

Na przykład, pozwala Załóżmy, ż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

Połączenie Wewnętrzne

Uwaga: daje przecięcie dwóch tabel.

Złącze 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: poda wszystkie zaznaczone wiersze w TableA oraz dowolne wspólne zaznaczone wiersze w TableB.

/ Align = "Left" /

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

Zastosuj go w tabeli próbek

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: poda wszystkie wybrane wiersze w TableB, plus wszystkie wspólne wybrane wiersze w TableA.

Right Join

Składnia:

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

Zastosuj go w tabeli samole:

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

Full Join

Uwaga: jest taka sama jak operacja union, zwróci wszystkie wybrane wartości z obu tabel.

Full join

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

Niektóre fakty

Dla Inner joins the order doesn ' t matter

For (LEFT, RIGHT or FULL) OUTER joins, the order Materia

Znajdź więcej na w3schools

 29
Author: Sushank Pokharel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-13 09:47:18
select fields 
from tableA --left
left join tableB --right
on tableA.key = tableB.key

Tabela from w tym przykładzie tableA znajduje się po lewej stronie relacji.

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

Więc jeśli chcesz pobrać wszystkie wiersze z lewej tabeli (tableA), nawet jeśli nie ma dopasowań w prawej tabeli (tableB), użyjesz "LEFT join".

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

Tak więc poniższe zapytanie jest równoważne powyżej.

select fields
from tableB 
right join tableA on tableB.key = tableA.key
 12
Author: Klevlon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-16 16:06:40

Wydaje się, że pytasz: "jeśli mogę przepisać RIGHT OUTER JOIN używając składni LEFT OUTER JOIN, to po co w ogóle mieć składnię RIGHT OUTER JOIN?"Myślę, że odpowiedź na to pytanie jest taka, ponieważ projektanci języka nie chcieli nakładać takiego ograniczenia na użytkowników (i myślę, że byliby krytykowani, gdyby to zrobili), co zmuszałoby użytkowników do zmiany kolejności tabel w klauzuli FROM w pewnych okolicznościach, gdy tylko zmieniłby Typ join.

 10
Author: onedaywhen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-18 11:06:46

Twoje dwa stwierdzenia są równoważne.

Większość ludzi używa tylko LEFT JOIN, ponieważ wydaje się to bardziej intuicyjne i jest uniwersalną składnią - nie sądzę, aby wszystkie RDBMS wspierały RIGHT JOIN.

 8
Author: JNK,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-17 16:57:36

Wydaje mi się, że możemy wymagać AND warunku w where klauzuli ostatniej liczby Outer Excluding JOIN, aby otrzymać pożądany wynik A Union B Minus A Interaction B. I feel query needs to be update to

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, wtedy otrzymamy wszystkie wyniki A Union B

 0
Author: vinsinraw,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-11 11:19:40

Wybierz * od Table1 left join Table2 on Table1.id = Table2.id

W pierwszym zapytaniu Left join porównuje left-sidedtable table1do right-sidedtable table2.

W którym zostaną pokazane wszystkie właściwości table1, podczas gdy w table2 zostaną pokazane tylko te właściwości, w których warunek ma wartość true.

Wybierz * od Table2 right join Table1 on Table1.id = Table2.id

W pierwsze zapytanie Right join porównuje right-sidedtable table1do left-sidedtable table2.

W którym zostaną pokazane wszystkie właściwości table1, podczas gdy w table2 zostaną pokazane tylko te właściwości, w których warunek ma wartość true.

Oba zapytania dadzą ten sam wynik, ponieważ kolejność deklaracji tabeli w zapytaniu jest inna Jak deklarujesz table1 i table2 w left i prawo odpowiednio w pierwszy lewy join zapytanie, a także deklarowanie table1 i table2 odpowiednio w prawy i lewy w drugi prawy join zapytanie.

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

Wybierz * od Table1 left join Table2 on Table1.id = Table2.id

Wybierz * od Table1 right join Table2 on Table1.id = Table2.id

 0
Author: Nisarg Shah,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-20 09:12:55

Select * from Table1 t1 Left Join Table2 t2 on t1.id=t2.id Z definicji: LEFT Join wybiera wszystkie kolumny wymienione ze słowem kluczowym " select "z tabeli 1 oraz kolumny z tabeli 2, które odpowiadają kryteriom po słowie kluczowym" on".

Podobnie, z definicji: Right Join wybiera wszystkie kolumny wymienione ze słowem kluczowym " select "z tabeli 2 oraz kolumny z tabeli 1, które odpowiadają kryteriom po słowie kluczowym" on".

Odnosząc się do twojego pytania, id w obu tabelach są porównywane ze wszystkimi kolumnami potrzebnymi do / align = "left" / Tak więc ID 1 i 2 są wspólne w obu tabelach i w wyniku tego będziesz miał cztery kolumny z idi namekolumny z firsti second tabele 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, przyjmuje wszystkie zapisy (wiersze) z tabeli 1 i kolumn, z pasującymi identyfikatorami z tabeli 1 i Tabeli 2 z tabeli 2. (pamiętaj, że jest to połączenie w prawo, więc wszystkie kolumny z table2, a nie z table1 będą brane pod uwagę).

 0
Author: VDWWD,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-14 19:10:36