Differenza tra sinistra e destra unire unirsi in SQL Server
-
12-10-2019 - |
Domanda
Lo so si unisce circa in SQL Server.
Ad esempio. Ci sono due tavoli Table1, Table2.
Le loro strutture delle tabelle sono le seguenti.
create table Table1 (id int, Name varchar (10))
create table Table2 (id int, Name varchar (10))
Dati Table1 come segue:
Id Name
-------------
1 A
2 B
Dati Table2 come segue:
Id Name
-------------
1 A
2 B
3 C
Se eseguo entrambi istruzioni SQL seguito menzionate, entrambe le uscite saranno uguali
select *
from Table1
left join Table2 on Table1.id = Table2.id
select *
from Table2
right join Table1 on Table1.id = Table2.id
Si prega di spiegare la differenza tra destra e sinistra unirsi nelle dichiarazioni di cui sopra SQL.
Soluzione
Select * from Table1 left join Table2 ...
e
Select * from Table2 right join Table1 ...
sono davvero completamente intercambiabili. Provare tuttavia Table2 left join Table1
(o la sua coppia identica, Table1 right join Table2
) per vedere una differenza. Questa query dovrebbe dare più righe, dal momento che Table2 contiene una riga con un ID che non è presente nella Tabella 1.
Altri suggerimenti
CodeProject ha questa immagine che spiega le semplici nozioni di base di SQL join, tratto da: http: //www.codeproject.com/KB/database/Visual_SQL_Joins.aspx
tabella da cui si stanno prendendo dei dati è 'sinistra'.
Tabella si stanno unendo è 'DESTRA'.
LEFT JOIN: Prendete tutti gli elementi dalla tabella a sinistra e (solo) oggetti corrispondenti da tabella di destra
.
RIGHT JOIN: Prendete tutti gli elementi dalla tabella a destra e (solo) oggetti corrispondenti da tavolo a sinistra
.
Quindi:
Select * from Table1 left join Table2 on Table1.id = Table2.id
dà:
Id Name
-------------
1 A
2 B
ma
Select * from Table1 right join Table2 on Table1.id = Table2.id
dà:
Id Name
-------------
1 A
2 B
3 C
Avevi ragione unirà tavolo con meno righe sulla tabella con più righe
E
ancora una volta, a sinistra tavolo unendo con meno righe sulla tabella con più righe
Prova:
If Table1.Rows.Count > Table2.Rows.Count Then
' Left Join
Else
' Right Join
End If
(INTERNO) JOIN:. Restituisce i record che hanno valori corrispondenti in entrambe le tabelle
LEFT (ESTERNO) si uniscono:. di ritorno tutti i record della tabella a sinistra, ed i record corrispondenti della tabella di destra
DESTRA (ESTERNO) JOIN:. di ritorno tutti i record della tabella di destra, ed i record corrispondenti dalla tabella di sinistra
FULL (ESTERNO) si uniscono: di ritorno tutti i record quando c'è una partita in una tabella a sinistra oa destra
Ad esempio, consente supponiamo di avere due tabella con i seguenti record:
Tabella A
id firstname lastname
___________________________
1 Ram Thapa
2 sam Koirala
3 abc xyz
6 sruthy abc
Tabella B
id2 place
_____________
1 Nepal
2 USA
3 Lumbini
5 Kathmandu
INNER JOIN
Nota: E dare l'intersezione di due tabella
.
Sintassi
SELECT column_name FROM table1 INNER JOIN table2 ON table1.column_name = table2.column_name;
Applica nella vostra tabella di esempio:
SELECT TableA.firstName,TableA.lastName,TableB.Place FROM TableA INNER JOIN TableB ON TableA.id = TableB.id2;
Il risultato sarà:
firstName lastName Place
_____________________________________
Ram Thapa Nepal
sam Koirala USA
abc xyz Lumbini
LEFT JOIN
. Nota: vi darà tutte le righe selezionate in TableA, oltre a qualsiasi comune, selezionato righe in TableB
SELECT column_name(s) FROM table1 LEFT JOIN table2 ON table1.column_name = table2.column_name;
Applica nella vostra tabella di esempio
SELECT TableA.firstName,TableA.lastName,TableB.Place FROM TableA LEFT JOIN TableB ON TableA.id = TableB.id2;
Il risultato sarà:
firstName lastName Place
______________________________
Ram Thapa Nepal
sam Koirala USA
abc xyz Lumbini
sruthy abc Null
destro Join
. Nota: vi darà tutte le righe selezionate in TableB, oltre a qualsiasi comune righe selezionate in TableA
La sintassi:
SELECT column_name(s) FROM table1 RIGHT JOIN table2 ON table1.column_name = table2.column_name;
applicarlo nella vostra tabella samole:
SELECT TableA.firstName,TableA.lastName,TableB.Place FROM TableA RIGHT JOIN TableB ON TableA.id = TableB.id2;
Il risultato sarà BW:
firstName lastName Place
______________________________
Ram Thapa Nepal
sam Koirala USA
abc xyz Lumbini
Null Null Kathmandu
completa Join
. Nota: E 'uguale al funzionamento dell'unione, tornerà tutti i valori selezionati da entrambe le tabelle
La sintassi:
SELECT column_name(s) FROM table1 FULL OUTER JOIN table2 ON table1.column_name = table2.column_name;
applicarlo nella vostra samp [le table:
SELECT TableA.firstName,TableA.lastName,TableB.Place FROM TableA FULL JOIN TableB ON TableA.id = TableB.id2;
Il risultato sarà:
firstName lastName Place
______________________________
Ram Thapa Nepal
sam Koirala USA
abc xyz Lumbini
sruthy abc Null
Null Null Kathmandu
Alcuni fatti
Per INNER unisce l'ordine non importa ??p>
Per (sinistra, destra o FULL) ESTERNO si unisce, la questione ordine
Trova Altro w3schools
select fields
from tableA --left
left join tableB --right
on tableA.key = tableB.key
La tabella nella from
in questo esempio tableA
, si trova sul lato sinistro della relazione.
tableA <- tableB
[left]------[right]
Quindi, se si vuole prendere tutte le righe della tabella di sinistra (tableA
), anche se non ci sono partite nella tabella di destra (tableB
), si utilizzerà la "sinistra join".
E se si vuole prendere tutte le righe della tabella di destra (tableB
), anche se non ci sono partite nella tabella di sinistra (tableA
), si utilizza la right join
.
Così, la seguente query è equivalente a quella utilizzata in precedenza.
select fields
from tableB
right join tableA on tableB.key = tableA.key
Sembra che tu stia chiedendo, "Se posso riscrivere una RIGHT OUTER JOIN
utilizzando la sintassi LEFT OUTER JOIN
allora perché avere una sintassi RIGHT OUTER JOIN
a tutti?" Penso che la risposta a questa domanda è, perché i progettisti del linguaggio non volevano mettere una tale restrizione sugli utenti (e penso che sarebbero stati criticati se lo facessero), che costringerebbe gli utenti a modificare l'ordine delle tabelle nella clausola FROM
in alcune circostanze, quando semplicemente cambiando il tipo di join.
I tuoi due affermazioni sono equivalenti.
La maggior parte delle persone utilizzano solo LEFT JOIN
dal momento che sembra più intuitivo, ed è la sintassi universale -. Non credo che tutto RIGHT JOIN
supporto RDBMS
mi sento potremmo richiedere condizioni AND
nella clausola where
di ultima figura di Outer Excluding JOIN
in modo da ottenere il risultato desiderato di A Union B Minus A Interaction B
.
Mi sento di query ha bisogno di essere aggiornati per
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
Se usiamo OR
, quindi avremo tutti i risultati di A Union B
selezionare * da Table1 sinistra unirsi Table2 su Table1.id = Table2.id
Nella prima query LEFT JOIN a confronto del lato sinistro tabella Tabella 1 a lato destro Tabella table2 .
in cui tutte le proprietà di Tabella 1 verrà mostrato, mentre in table2 solo le proprietà verrà mostrato in cui condizione di ottenere vera.
selezionare * da Table2 destra unirsi Table1 su Table1.id = Table2.id
Nella prima query destro unirsi a confronto lato destro tabella Tabella 1 a del lato sinistro Tabella table2 .
in cui tutte le proprietà di Tabella 1 verrà mostrato, mentre in table2 solo le proprietà verrà mostrato in cui condizione di ottenere vera.
Entrambe le query darà lo stesso risultato perché l'ordine di dichiarazione di tabella nella query sono diversi , come si dichiara Tabella 1 e table2 in < strong> a sinistra ea destra , rispettivamente, in prima a sinistra unirsi query e anche dichiarando Tabella 1 e table2 in a destra e sinistra , rispettivamente, in seconda a destra unirsi query.
Questo è il motivo per cui si stanno ottenendo lo stesso risultato in entrambe le query. Quindi, se volete risultati diversi quindi eseguire questo due interrogazioni, rispettivamente,
selezionare * da Table1 sinistra unirsi Table2 su Table1.id = Table2.id
selezionare * da Table1 destra unirsi Table2 su Table1.id = Table2.id
Select * from Table1 t1 Left Join Table2 t2 on t1.id=t2.id
Per definizione: LEFT JOIN seleziona tutte le colonne indicate con la parola chiave "selezionate" dalla Tabella 1 e le colonne della tabella 2, che corrisponde ai criteri dopo la "on" parola chiave
Allo stesso modo, per definizione: destro Registrato seleziona tutte le colonne indicate con la parola chiave "selezionate" dalla Tabella 2 e le colonne dalla tabella 1, che corrisponde ai criteri dopo la "on" parola chiave
.Con riferimento alla tua domanda, di id in entrambe le tabelle sono confrontati con tutte le colonne necessarie per essere gettato in uscita. Così, IDS 1 e 2 sono comuni nelle due tabelle e di conseguenza nel risultato si avrà quattro colonne con id e nome colonne da prima e secondo tabelle in ordine.
*select *
from Table1
left join Table2 on Table1.id = Table2.id
L'espressione precedente, prende tutti i record (righe) dalla tabella 1 e colonne, con la corrispondenza di id dalla tabella 1 e tabella 2, dalla tabella 2.
select *
from Table2
right join Table1 on Table1.id = Table2.id**
Analogamente dall'espressione sopra, prende tutti i record (righe) dalla tabella 1 e colonne, con la corrispondenza di id dalla tabella 1 e tabella 2, da tavolo 2. (ricordate, questo è un giusto unirsi in modo che tutti saranno prese in considerazione le colonne table2 e non da table1).