Differenza tra join sinistro e join destro in SQL Server


225

Conosco i join in SQL Server.

Per esempio. Esistono due tabelle Table1, Table2.

Le strutture delle loro tabelle sono le seguenti.

create table Table1 (id int, Name varchar (10))

create table Table2 (id int, Name varchar (10))

Tabella1 dati come segue:

    Id     Name     
    -------------
    1      A        
    2      B    

Dati della tabella2 come segue:

    Id     Name     
    -------------
    1      A        
    2      B 
    3      C

Se eseguo entrambe le istruzioni SQL di seguito indicate, 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

Spiegare la differenza tra join destro e sinistro nelle precedenti istruzioni SQL.

Risposte:


73
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 fornire più righe, poiché Table2 contiene una riga con un ID che non è presente in Table1.


17
Allora perché abbiamo bisogno RIGHT JOINse possiamo ottenere qualsiasi risultato desiderato con solo LEFT JOIN? : P
user1857492

1
@SilapAliyev Questa è in realtà un'ottima domanda. Qualcuno può rispondere? : D
Ian Chu Te

21
Select * from Table1 left join Table 2restituirà TUTTI i record della tabella 1 più i record coincidenti della tabella 2. Il contrario Select * from Table1 right join Table 2restituirebbe TUTTI i record della tabella 2 e i record coincidenti della tabella 1. Spera che sia d'aiuto.
Programador Adagal,

3
se usi più di 2 tabelle, usare il join destro può essere significativo e leggibile
ɐɯıɥʇɹɐʞ ouɐɯ

1
@MarkusMeskanen stai cambiando una semplice frase di 7 parole. Quando hai una frase di 356 righe con più sussidi e devi cambiare la logica di Left Right, ti chiederai di cambiarla con una sola parola ...
Programador Adagal,

1014

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


64
Non ci sono molti "dettagli" lì dentro. Il credito dovrebbe effettivamente andare alla pagina di codeproject invece che a me. Ma ovviamente non mi interessa l'attenzione :-)
Daan Timmer,

6
@Daan Timmer no, ci deve essere credito anche per te! Reimballare e rivendere per soddisfare una richiesta specifica e particolare. I rivenditori fanno lo stesso e ottengono $ miliardi
BKSpurgeon il

Ritengo che potremmo richiedere la condizione "AND" in cui la clausola dell'ultima cifra di "Outer Excluding JOIN". Sento che la query deve essere aggiornata per SELEZIONARE <select_list> DA Table_A A FULL OUTER JOIN Table_B B ON A.Key = B.Key DOVE A.Key È NULL E B.Key IS NULL
vinsinraw

@vinsinraw che non è necessario. Perché questo è già coperto dalla condizione: JOIN Table_B b ON A.Key = B.Key. La condizione OR funziona bene.
Daan Timmer,

Questo è un abuso comune dei diagrammi di Venn. I cerchi A e B non rappresentano le tabelle A e B, il cerchio A è A SINISTRA UNIONE B e il cerchio B è A DESTRA UNIONE B. Inoltre, non importa quale sia la condizione ON e i tasti sono irrilevanti e DOVE non funzionano tutti Astuccio. Vedi i miei commenti e le risposte su questa pagina e questa sezione diagrammi di Re Venn .
Philipxy,

37

La tabella da cui si stanno prendendo i dati è 'SINISTRA'.
La tabella a cui ti stai unendo è 'DESTRA'.
JOIN SINISTRA: prende tutti gli oggetti dalla tabella di sinistra E (solo) gli oggetti corrispondenti dalla tabella di destra.
JOIN DESTRO: prendi tutti gli oggetti dalla tabella di destra E (solo) gli oggetti corrispondenti dalla tabella di 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 sulla tabella con più righe
E
ancora, a sinistra unendo la tabella con meno righe sulla tabella con più righe
Prova:

 If Table1.Rows.Count > Table2.Rows.Count Then  
    ' Left Join  
 Else  
    ' Right Join  
 End If  

22

(INNER) JOIN: restituisce i record con 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 di sinistra.

FULL (OUTER) JOIN: restituisce tutti i record in caso di 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

Inner Join

Nota: indica 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 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

Sinistra Join

Nota: fornirà tutte le righe selezionate in TableA, più eventuali righe selezionate comuni in TableB.

Join sinistro

SELECT column_name(s) FROM table1 LEFT JOIN table2 ON table1.column_name = table2.column_name;

Applicalo nella 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

Partecipa a destra

Nota: fornirà tutte le righe selezionate in TableB, più eventuali righe selezionate comuni in TableA.

Partecipa a destra

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

Partecipazione completa

Nota: è uguale all'operazione di unione, restituirà tutti i valori selezionati da entrambe le tabelle.

Partecipazione completa

Sintassi:

SELECT column_name(s) FROM table1 FULL OUTER JOIN table2 ON table1.column_name = table2.column_name;

Applicalo nel tuo campionario [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 si unisce all'ordine non importa

Per i join ESTERNI (SINISTRA, DESTRA o COMPLETO), l'ordine conta

Scopri di più su w3schools


12
select fields 
from tableA --left
left join tableB --right
on tableA.key = tableB.key

La tabella in fromquesto esempio tableAè 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 "join sinistro".

E se vuoi prendere tutte le righe dalla tabella di destra ( tableB), anche se non ci sono corrispondenze nella tabella di sinistra ( tableA), userai il right join.

Pertanto, la seguente query è equivalente a quella utilizzata in precedenza.

select fields
from tableB 
right join tableA on tableB.key = tableA.key

10

Sembra che tu stia chiedendo "Se posso riscrivere una sintassi RIGHT OUTER JOINusando LEFT OUTER JOINallora perché avere una RIGHT OUTER JOINsintassi?" Penso che la risposta a questa domanda sia, perché i progettisti della lingua non volevano porre una tale limitazione agli utenti (e penso che sarebbero stati criticati se lo avessero fatto), il che costringerebbe gli utenti a cambiare l'ordine delle tabelle nella FROMclausola in alcune circostanze quando si cambia semplicemente il tipo di join.


a volte i giunti esterni sinistro e destro sono completamente intercambiabili, giusto?
ア レ ッ ク ス

4
@Alex: infatti i join esterni sinistro e destro sono sempre intercambiabili.
giorno

8

Le tue due dichiarazioni sono equivalenti.

Molte persone usano solo LEFT JOINperché sembra più intuitivo, ed è una sintassi universale - non credo che tutto il supporto RDBMS RIGHT JOIN.


"Non credo che tutti gli RDBMS supportino RIGHT JOIN" - certo, non tutti gli RDBMS supportano SQL. Ma se stai insinuando che alcuni prodotti SQL supportano LEFTma non RIGHTallora indica quali.
giorno

10
@onedaywhen Ad esempio, SQLite 3 non implementa RIGHTe FULL OUTER JOIN : sqlite.org/omitted.html
Mac_Cain13

0

Sento che potremmo aver bisogno della ANDcondizione nella whereclausola dell'ultima cifra in Outer Excluding JOINmodo da ottenere il risultato desiderato di A Union B Minus A Interaction B. Sento che la query deve essere aggiornata a

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 diA Union B


0

selezionare * da Table1 a sinistra unire Table2 su Table1.id = Table2.id

Nella prima query join sinistro confronta lato sinistro tabella table1 al lato destro tabella Table2 .

In cui verranno mostrate tutte le proprietà di table1 , mentre in table2 verranno mostrate solo quelle proprietà in quali condizioni diventano vere.

selezionare * da Table2 a destra unire Table1 su Table1.id = Table2.id

Nella prima query join destro confronta lato destro tabella table1 a sinistra-retro tabella Table2 .

In cui verranno mostrate tutte le proprietà di table1 , mentre in table2 verranno mostrate solo quelle proprietà in quali condizioni diventano vere.

Entrambe le query daranno lo stesso risultato perché l'ordine della dichiarazione della tabella nella query è diverso come si dichiarano table1 e table2 rispettivamente a sinistra e a destra nella prima query di join a sinistra e anche la tabella 1 e table2 a destra e a sinistra rispettivamente nella seconda a destra join query.

Questo è il motivo per cui stai ottenendo lo stesso risultato in entrambe le query. Quindi, se desideri risultati diversi, esegui rispettivamente queste due query,

selezionare * da Table1 a sinistra unire Table2 su Table1.id = Table2.id

selezionare * da Table1 a destra unire Table2 su Table1.id = Table2.id


0

Select * from Table1 t1 Left Join Table2 t2 on t1.id=t2.id Per definizione: Sinistra Join seleziona tutte le colonne menzionate con la parola chiave "select" dalla Tabella 1 e le colonne dalla Tabella 2 che corrispondono ai criteri dopo la parola chiave "on".

Allo stesso modo, per definizione: Right Join seleziona tutte le colonne menzionate con la parola chiave "select" dalla tabella 2 e le colonne dalla tabella 1 che corrispondono ai criteri dopo la parola chiave "on".

Facendo riferimento alla tua domanda, gli ID in entrambe le tabelle vengono confrontati con tutte le colonne necessarie per essere lanciate nell'output. Pertanto, gli ID 1 e 2 sono comuni in entrambe le tabelle e di conseguenza nel risultato si avranno quattro colonne con colonne id e nome dalla prima e seconda tabella 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 dalle colonne, con ID corrispondenti dalla tabella 1 e dalla tabella 2, dalla tabella 2.

select * from Table2 right join Table1 on Table1.id = Table2.id**

Analogamente all'espressione precedente, prende tutti i record (righe) dalla tabella 1 e dalle colonne, con ID corrispondenti dalla tabella 1 e dalla tabella 2, dalla tabella 2. (ricorda, questo è un join corretto, quindi tutte le colonne dalla tabella2 e non dalla tabella 1 saranno considerati).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.