Qual è la differenza tra CROSS JOIN e FULL OUTER JOIN in SQL Server?SQL Server: qual è la differenza tra CROSS JOIN e FULL OUTER JOIN?
Sono uguali o no? Spiega per favore. Quando si userebbe uno di questi?
Qual è la differenza tra CROSS JOIN e FULL OUTER JOIN in SQL Server?SQL Server: qual è la differenza tra CROSS JOIN e FULL OUTER JOIN?
Sono uguali o no? Spiega per favore. Quando si userebbe uno di questi?
Un join trasversale produce un prodotto cartesiano tra le due tabelle, restituendo tutte le possibili combinazioni di tutte le righe. Non ha la clausola on
perché stai solo unendo tutto a tutto.
A full outer join
è una combinazione di un left outer
e right outer
join. Restituisce tutte le righe in entrambe le tabelle che corrispondono alla clausola where
della query e nei casi in cui la condizione on
non può essere soddisfatta per quelle righe in cui inserisce i valori null
per i campi non popolati.
Questo articolo wikipedia spiega i vari tipi di join con esempi di output dati un insieme di tabelle di esempio.
Croce registrazione: http://www.dba-oracle.com/t_garmany_9_sql_cross_join.htm
TLDR: genera un tutte le combinazioni possibili tra 2 tavoli (di prodotti cartesiani)
(Full) Outer Join: http://www.w3schools.com/Sql/sql_join_full.asp
TLDR: restituisce ogni riga nelle tabelle bot e corrisponde a quei risultati che hanno gli stessi valori
Cross join: Cross Joins produce risultati che consistono in ogni combinazione di righe da due o più tabelle. Ciò significa che se la tabella A ha 3 righe e la tabella B ha 2 righe, un CROSS JOIN darà 6 righe. Non esiste una relazione stabilita tra i due tavoli: si produce letteralmente ogni combinazione possibile.
Join esterno completo: UN FULL OUTER JOIN non è né "left" né "right" - è entrambi! Include tutte le righe di entrambe le tabelle o set di risultati che partecipano al JOIN. Se non esistono righe corrispondenti per le righe sul lato "sinistro" di JOIN, vengono visualizzati i valori Null dal set di risultati sulla "destra". Viceversa, quando non esistono righe corrispondenti per le righe sul lato "destro" del JOIN, vengono visualizzati i valori Null dal set di risultati sulla "sinistra".
vorrei aggiungere un aspetto importante da altre risposte, che in realtà spiegato questo argomento a me nel migliore dei modi:
Se si è unito 2 tabelle contengono M e N righe, poi cross join produrrà sempre (M x N), ma il join esterno completo produrrà dalle righe MAX (M, N) a (M + N) (a seconda di quante righe corrispondono effettivamente al predicato "on").
EDIT:
Dalla prospettiva elaborazione query logica, cross join fa effettivamente sempre produce M x N righe. Quello che succede con FULL OUTER JOIN è che entrambe le tabelle sinistra e destra sono "conservate", come se si fosse verificata l'unione sia di sinistra sia di destra. Quindi le righe, non soddisfacenti sul predicato ON, da entrambe le tabelle sinistra e destra vengono aggiunte al set di risultati.
Questi limiti escludono le possibili partite 1-molti? Un join esterno completo è ancora in grado di produrre righe (M x N). – maxwellb
selezionare COUNT_BIG (\ *) dal traffico t cross join destinatario r e SELEZIONA COUNT_BIG (\ *) dal traffico t PIENO JOIN destinatario r ON (1 = 1) sono la stessa cosa. – urlreader
La tua è la migliore risposta reale.Fondamentalmente: un "cross join" moltiplica le tabelle; un 'full outer join 'li aggiunge nel peggiore dei casi, a seconda di quante righe corrispondono .. –
Ciao sono gli stessi concetti a parte il valore NULL restituito.
Vedere sotto:
declare @table1 table ( col1 int, col2 int)
declare @table2 table ( col1 int, col2 int)
insert into @table1 select 1, 11 union all select 2, 22
insert into @table2 select 10, 101 union all select 2, 202
select *
from @table1 t1 full outer join @table2 t2
on t1.col1 = t2.col1
/* RESULT
col1 col2 col1 col2
----------- ----------- ----------- -----------
NULL NULL 10 101
2 22 2 202
1 11 NULL NULL
(3 row(s) affected)
*/
select *
from @table1 t1 cross join @table2 t2
/* RESULT
col1 col2 col1 col2
----------- ----------- ----------- -----------
1 11 10 101
2 22 10 101
1 11 2 202
2 22 2 202
(4 row(s) affected)
*/
Una cosa che potrebbe non essere sempre ovvio per alcuni è che un cross join con una tabella vuota (o set di risultati) risulta in tabella vuota (M x N; quindi M x 0 = 0)
Un full outer join avrà sempre le righe a meno che sia M e N sono 0.
Aggiunta di una generalizzazione, cross join ha sempre risultati MxN. Mentre join esterno ha righe di risultato da qualche parte nel range [(M + N), MxN], anche il numero effettivo di righe dipende dal set di dati e dalle condizioni ON. –
full outer join:
Questa unirsi combina sinistra outer join e joi esterno destro n. Restituisce una riga da una delle due tabelle quando le condizioni sono soddisfatte e restituisce un valore nullo quando non c'è corrispondenza.
immagine: (http://www.pinaldave.com/bimg/March09UG/outer%20join.jpg)
Croce registrazione:
Questo join è un join cartesiano che non richiede alcuna condizione di aderire. Il set di risultati contiene record che moltiplicano il numero di record di entrambe le tabelle.
immagine: (http://www.pinaldave.com/bimg/March09UG/cross%20join%20-%20half.jpg)
Per SQL Server, CROSS JOIN and FULL OUTER JOIN
sono diversi. CROSS JOIN
è semplicemente un prodotto cartesiano di due tabelle, indipendentemente da qualsiasi criterio di filtro o condizione.
FULL OUTER JOIN
fornisce un set di risultati unico di LEFT OUTER JOIN and RIGHT OUTER JOIN
di due tabelle. Ha anche bisogno della clausola ON per mappare due colonne di tabelle.
La tabella 1 contiene 10 righe e la Tabella 2 contiene 20 righe con 5 righe corrispondenti su colonne specifiche.
Quindi
CROSS JOIN
restituirà 10 * 20 = 200 righe nel set di risultati.
FULL OUTER JOIN
restituirà 25 righe nel set di risultati.
FULL OUTER JOIN
(o qualsiasi altro JOIN) restituisce sempre il set di risultati con minore o uguale aCartesian Product number
.Numero di righe restituite da
FULL OUTER JOIN
uguale a (n di righe daLEFT OUTER JOIN
) + (Numero di righeRIGHT OUTER JOIN
) - (Numero di righeINNER JOIN
).
Ecco un esempio in cui sia FULL OUTER JOIN che CROSS JOIN restituiscono lo stesso set di risultati senza restituire NULL.Si prega di notare il 1 = 1 nella clausola ON per il full outer join:
declare @table1 table ( col1 int, col2 int)
declare @table2 table ( col1 int, col2 int)
insert into @table1 select 1, 11 union all select 2, 22
insert into @table2 select 10, 101 union all select 2, 202
select *
from @table1 t1 full outer join @table2 t2
on 1 = 1
(2 row(s) affected) (2 row(s) affected) col1 col2 col1 col2 ----------- ----------- ----------- ----------- 1 11 10 101 2 22 10 101 1 11 2 202 2 22 2 202
select *
from @table1 t1 cross join @table2 t2
col1 col2 col1 col2 ----------- ----------- ----------- ----------- 1 11 10 101 2 22 10 101 1 11 2 202 2 22 2 202 (4 row(s) affected)
SQL full outer join
L'ESTERNO PIENO JOIN restituisce tutte le righe dalla tabella di sinistra (tabella1) e dalla tabella di destra (tabella 2) indipendentemente dalla partita.
Il join esterno completo parola combina il risultato sia LEFT OUTER JOIN e RIGHT OUTER JOIN
Riferimento: http://datasciencemadesimple.com/sql-full-outer-join/
SQL CROSS JOIN
In SQL CROSS JOIN Ogni riga della prima tabella viene mappata con ciascuna riga della seconda tabella.
Il numero di righe prodotto da un set di risultati dell'operazione CROSS JOIN è uguale al numero di righe nella prima tabella moltiplicato per il numero di righe nella seconda tabella.
CROSS JOIN è noto anche come prodotto cartesiano/cartesiana
numero di righe nella tabella A è m, numero di righe nella tabella B è N e tabella risultante avrà m * n righe
Riferimento: http://datasciencemadesimple.com/sql-cross-join/
Poi, nel caso di grandi tavoli 'da T1 full outer join t2 ON t1.id = t2.id' sarà sempre più veloce di ' DA t1, t2 WHE RE t1.id = t2.id' ? – alexkovelsky
I join interni @alexkovelsky sono spesso più veloci quando ci sono poche corrispondenze tra le due tabelle, poiché l'uso di indici significa che non si preoccupa di leggere tutte le righe su una delle tabelle. un join esterno completo deve sempre leggere tutte le righe in entrambe le tabelle (o gli indici rilevanti). Nel caso in cui gli indici non siano sufficienti o debba essere letto un heap sottostante per generare le colonne necessarie, un join esterno completo è quasi sempre più lento di un join interno. –
È "outer join" più veloce o "cross join"? – Shafizadeh