Conosco i join in SQL Server.
Per esempio. Ci sono due tabelle Table1, Table2.
Le loro strutture di tabella sono le seguenti.
create table Table1 (id int, Name varchar (10))
create table Table2 (id int, Name varchar (10))
Tabella 1 dati come segue:
Id Name
-------------
1 A
2 B
Tabella 2 dati come segue:
Id Name
-------------
1 A
2 B
3 C
Se eseguo entrambe le istruzioni SQL sotto menzionate, entrambe le uscite saranno le stesse
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 sinistra e destra join nelle istruzioni SQL di cui sopra.
Select * from Table1 left join Table2 ...
e
Select * from Table2 right join Table1 ...
sono infatti completamente intercambiabili. Prova comunque Table2 left join Table1
(o la sua coppia identica, Table1 right join Table2
) per vedere una differenza. Questa query dovrebbe darti più righe, poiché Table2 contiene una riga con un ID che non è presente in Table1.
Codeproject ha questa immagine che spiega le semplici basi dei join SQL, presi da: http://www.codeproject.com/KB/database/Visual_SQL_Joins.aspx
La tabella da cui si stanno prendendo i dati è 'SINISTRA'.
La tabella a cui ti unisci è 'RIGHT'.
UNISCI SINISTRA: prendi tutti gli oggetti dalla tabella sinistra E (solo) gli oggetti corrispondenti dal tavolo di destra.
GIUSTO GIUSTO: Prendi tutti gli oggetti dalla tabella di destra E (solo) gli oggetti corrispondenti dalla tabella sinistra.
Così:
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 a unire la tabella con meno righe sul tavolo con più righe
E
di nuovo, ha lasciato la tabella di join con meno righe sulla tabella con più righe
Provare:
If Table1.Rows.Count > Table2.Rows.Count Then
' Left Join
Else
' Right Join
End If
select fields
from tableA --left
left join tableB --right
on tableA.key = tableB.key
La tabella in from
in questo esempio tableA
, si trova sul lato sinistro della relazione.
tableA <- tableB
[left]------[right]
Quindi, se vuoi prendere tutte le righe dalla tabella di sinistra (tableA
), anche se non ci sono corrispondenze nella tabella di destra (tableB
), utilizzerai il "left join".
E se vuoi prendere tutte le righe dalla tabella di destra (tableB
), anche se non ci sono corrispondenze nella tabella di sinistra (tableA
), userai right join
.
Pertanto, la seguente query è equivalente a quella utilizzata sopra.
select fields
from tableB
right join tableA on tableB.key = tableA.key
(INTERNO) JOIN: Restituisce i record che hanno valori corrispondenti in entrambe le tabelle.
LEFT (OUTER) JOIN: Restituisce tutti i record dalla tabella di sinistra e i record corrispondenti dalla tabella di destra.
RIGHT (OUTER) JOIN: Restituisce tutti i record dalla tabella di destra e i record corrispondenti dalla tabella sinistra.
FULL (OUTER) JOIN: Restituisce tutti i record quando c'è una corrispondenza nella tabella sinistra o destra
Ad esempio, supponiamo di avere due tabelle 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
Join interno
Nota: dà l'intersezione di due tabelle.
Sintassi
SELECT column_name FROM table1 INNER JOIN table2 ON table1.column_name = table2.column_name;
Applicalo nella tua 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
Join sinistro
Nota: fornirà tutte le righe selezionate in TabellaA, più eventuali righe selezionate comuni in TabellaB.
SELECT column_name(s) FROM table1 LEFT JOIN table2 ON table1.column_name = table2.column_name;
Applicalo nella tua 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
Right Join
Nota: fornirà tutte le righe selezionate in TabellaB, più eventuali righe selezionate comuni in TabellaA.
Sintassi:
SELECT column_name(s) FROM table1 RIGHT JOIN table2 ON table1.column_name = table2.column_name;
Applicalo nella tua 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
Iscrizione completa
Nota: è uguale all'operazione unione, restituirà tutti i valori selezionati da entrambe le tabelle.
Sintassi:
SELECT column_name(s) FROM table1 FULL OUTER JOIN table2 ON table1.column_name = table2.column_name;
Applicalo nel tuo 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, l'ordine non ha importanza
Per (LEFT, RIGHT o FULL) OUTER si unisce, l'ordine importa
Trova altro su w3schools
Sembra che tu stia chiedendo: "Se riesco a riscrivere un RIGHT OUTER JOIN
usando la sintassi LEFT OUTER JOIN
, allora perché hai una sintassi RIGHT OUTER JOIN
?" Penso che la risposta a questa domanda sia, perché i progettisti della lingua non volevano porre una simile restrizione sugli utenti (e penso che sarebbero stati criticati se lo avessero fatto), il che costringerebbe gli utenti a cambiare l'ordine delle tabelle nella clausola FROM
in alcune circostanze quando si modifica semplicemente il tipo di join.
Le tue due affermazioni sono equivalenti.
La maggior parte delle persone usa solo LEFT JOIN
dal momento che sembra più intuitiva, ed è sintassi universale - Non credo che tutti i RDBMS supportino RIGHT JOIN
.
Ritengo che potremmo richiedere la condizione AND
nella clausola where
dell'ultima cifra di Outer Excluding JOIN
in modo da ottenere il risultato desiderato di A Union B Minus A Interaction B
. Ritengo che la query debba essere aggiornata
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
, otterremo tutti i risultati di A Union B
seleziona * da Table1 left join Table2 su Table1.id = Table2.id
Nella prima query Left join compare left-sided table table1 a right-sided table table2 .
In cui verranno mostrate tutte le proprietà di table1 , mentre in table2 verranno mostrate solo quelle proprietà in cui le condizioni diventano vere.
seleziona * da Tabella2 accedi a Table1 su Table1.id = Table2.id
Nella prima query Right join compare right-sided table table1 a left-sided table table2 .
In cui verranno mostrate tutte le proprietà di table1 , mentre in table2 verranno mostrate solo quelle proprietà in cui le condizioni diventano vere.
Entrambe le query danno lo stesso risultato perché l'ordine della dichiarazione della tabella nella query è diverso come stai dichiarando table1 e table2 in left and right rispettivamente in prima left join query, e anche dichiarando table1 e table2 in right and left rispettivamente in seconda destra join query.
Questo è il motivo per cui ottieni lo stesso risultato in entrambe le query. Quindi, se vuoi ottenere risultati diversi, esegui queste due query rispettivamente,
seleziona * da Table1 left join Table2 su Table1.id = Table2.id
seleziona * da Tabella1 accedi a 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 menzionate con la parola chiave "select" della Tabella 1 e le colonne della Tabella 2 che corrispondono ai criteri dopo la parola chiave "on".
Analogamente, per definizione: Right Join seleziona tutte le colonne menzionate con la parola chiave "select" dalla Tabella 2 e le colonne della Tabella 1 che corrispondono ai criteri dopo la parola chiave "on".
Facendo riferimento alla tua domanda, gli ID di entrambe le tabelle vengono confrontati con tutte le colonne necessarie per essere gettato nell'output. Quindi, ID 1 e 2 sono comuni in entrambe le tabelle e di conseguenza nel risultato si avranno quattro colonne con id e name colonne da prima e seconde tavoli in ordine.
*select * from Table1 left join Table2 on Table1.id = Table2.id
L'espressione sopra, prende tutti i record (righe) dalla tabella 1 e le colonne, con l'id corrispondente dalla tabella 1 e dalla tabella 2, dalla tabella 2.
select * from Table2 right join Table1 on Table1.id = Table2.id**
Allo stesso modo dall'espressione sopra, prende tutti i record (righe) dalla tabella 1 e dalle colonne, con l'id corrispondente dalla tabella 1 e dalla tabella 2, dalla tabella 2. (ricorda, questo è un join destro in modo da considerare tutte le colonne da table2 e non da table1).