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.

È stato utile?

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 SQL join spiegato

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

.

 Inner Join

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

 LEFT jOIN

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

 right Join

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

 Full join

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

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top