Różnica między lewym połączeniem A prawym połączeniem w SQL Server [duplikat]
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.
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.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
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.
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.
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.
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.
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
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
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.
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
.
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
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
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ę).
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