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.
sql
sql-server
join
left-join
right-join
Pankaj Agarwal
źródło
źródło
RIGHT JOIN
jeśli tylko możemy osiągnąć pożądany rezultatLEFT JOIN
? : PSelect * from Table1 left join Table 2
zwróci WSZYSTKIE rekordy z tabeli 1 oraz rekordy zbieżne z Tabeli 2. PrzeciwnieSelect * from Table1 right join Table 2
zwróci WSZYSTKIE rekordy z Tabeli 2 i rekordy zbiegów z Tabeli 1. Ma nadzieję, że to pomoże.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
źródło
JOIN Table_B b ON A.Key = B.Key
. Warunek OR działa dobrze.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:
daje:
ale:
daje:
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:
źródło
(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:
Przyłączenie wewnętrzne
Składnia
Zastosuj go w przykładowej tabeli:
Wynik będzie:
Left Join
Zastosuj go w przykładowej tabeli
Wynik będzie:
Right Join
Składnia:
Zastosuj go w tabeli samoli:
Wynik będzie bw:
Pełne dołączenie
Składnia:
Zastosuj go w swoim samp [le table:
Wynik będzie:
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
źródło
Tabela w
from
tym przykładzietableA
znajduje się po lewej stronie relacji.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żyjeszright join
.Zatem poniższe zapytanie jest równoważne z powyższym.
źródło
Wydaje się, że pytanie: „Jeśli mogę przepisać
RIGHT OUTER JOIN
przy użyciuLEFT OUTER JOIN
składni, to dlaczego mająRIGHT OUTER JOIN
skł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 wFROM
klauzuli w niektórych okolicznościach, gdy zmienia się jedynie typ łączenia.źródło
Twoje dwa stwierdzenia są równoważne.
Większość ludzi korzysta tylko
LEFT JOIN
dlatego, że wydaje się bardziej intuicyjna, a jej uniwersalna składnia - nie sądzę, aby wszystkie obsługiwały RDBMSRIGHT JOIN
.źródło
LEFT
ale nie,RIGHT
proszę wskazać, które z nich.RIGHT
iFULL OUTER JOIN
: sqlite.org/omitted.htmlWydaje mi się, że możemy wymagać
AND
spełnienia warunkuwhere
z ostatniej cyfry,Outer Excluding JOIN
aby uzyskać pożądany wynikA Union B Minus A Interaction B
. Wydaje mi się, że zapytanie wymaga aktualizacjiJeśli użyjemy
OR
, uzyskamy wszystkie wynikiA Union B
źródło
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
źródło
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ę).
źródło