risposta-alla-domanda-sullo-sviluppo-web-bd.com

Differenza tra join sinistro e destro join in SQL Server

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.

215
Pankaj Agarwal
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.

71
Péter Török

Codeproject ha questa immagine che spiega le semplici basi dei join SQL, presi da: http://www.codeproject.com/KB/database/Visual_SQL_Joins.aspx SQL joins explained

992
Daan Timmer

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  
37
vbole
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
12
Moraes

(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.

Inner Join

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.

Left join

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.

Right Join

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.

Full join

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

10
Sushank Pokharel

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.

10
onedaywhen

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.

8
JNK

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

0
vinsinraw

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

0
Nisarg Shah

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).

0
user5837472