Qual è la differenza tra CROSS JOIN e FULL OUTER JOIN in SQL Server?
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?
Sono uguali o no? Spiega per favore. Quando si userebbe uno di questi?
Risposte:
Un cross join produce un prodotto cartesiano tra le due tabelle, restituendo tutte le possibili combinazioni di tutte le righe. Non ha on
clausole perché stai unendo tutto a tutto.
A full outer join
è una combinazione di a left outer
e right outer
join. Restituisce tutte le righe in entrambe le tabelle che corrispondono alla where
clausola della query e nei casi in cui la on
condizione non può essere soddisfatta per quelle righe, inserisce i null
valori per i campi non popolati.
Questo articolo di Wikipedia spiega i vari tipi di join con esempi di output dati un set di tabelle di esempio.
outer join
più veloce o cross join
?
Una cosa che potrebbe non essere sempre ovvia per alcuni è che un cross join con una tabella vuota (o set di risultati) si traduce in una tabella vuota (M x N; quindi M x 0 = 0)
Un join esterno completo avrà sempre righe a meno che sia M che N siano 0.
Vorrei aggiungere un aspetto importante ad altre risposte, che in realtà mi ha spiegato questo argomento nel migliore dei modi:
Se 2 tabelle unite contengono righe M e N, allora il join incrociato produrrà sempre (M x N) righe, ma il join esterno completo produrrà da MAX (M, N) a (M + N) righe (a seconda di quante righe effettivamente corrisponde al predicato "on").
MODIFICARE:
Dal punto di vista dell'elaborazione logica delle query, CROSS JOIN produce infatti sempre righe M x N. Quello che succede con FULL OUTER JOIN è che entrambe le tabelle sinistra e destra vengono "conservate", come se si verificassero entrambi i join LEFT e RIGHT. Quindi le righe, che non soddisfano il predicato ON, dalle tabelle sinistra e destra vengono aggiunte al set di risultati.
cross join
moltiplica le tabelle; a full outer join
li aggiunge nel peggiore dei casi, a seconda di quante righe corrispondono ..
Join incrociati: i join incrociati producono 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 comporterà 6 righe. Non esiste una relazione stabilita tra le due tabelle: si produce letteralmente ogni possibile combinazione.
Full outer Join: UN FULL OUTER JOIN non è né "sinistra" né "destra" - sono entrambi! Include tutte le righe di entrambe le tabelle o i set di risultati che partecipano al JOIN. Quando non esistono righe corrispondenti per le righe sul lato "sinistro" di JOIN, si vedono i valori Null dal set di risultati sulla "destra". Al contrario, quando non esistono righe corrispondenti per le righe sul lato "destro" di JOIN, i valori Null del set di risultati vengono visualizzati a "sinistra".
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 univoco LEFT OUTER JOIN and RIGHT OUTER JOIN
di due tabelle. Inoltre ha 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
FULL OUTER JOIN
uguale a (N. di righe perLEFT OUTER JOIN
) + (N. di righe perRIGHT OUTER JOIN
) - (N. di righe perINNER JOIN
).
Sono gli stessi concetti, a parte il valore NULL restituito.
Vedi sotto:
declare @table1 table( col1 int, col2 int );
insert into @table1 select 1, 11 union all select 2, 22;
declare @table2 table ( col1 int, col2 int );
insert into @table2 select 10, 101 union all select 2, 202;
select
t1.*,
t2.*
from @table1 t1
full outer join @table2 t2 on t1.col1 = t2.col1
order by t1.col1, t2.col1;
/* full outer join
col1 col2 col1 col2
----------- ----------- ----------- -----------
NULL NULL 10 101
1 11 NULL NULL
2 22 2 202
*/
select
t1.*,
t2.*
from @table1 t1
cross join @table2 t2
order by t1.col1, t2.col1;
/* cross join
col1 col2 col1 col2
----------- ----------- ----------- -----------
1 11 2 202
1 11 10 101
2 22 2 202
2 22 10 101
*/
Cross Join : http://www.dba-oracle.com/t_garmany_9_sql_cross_join.htm
TLDR;Genera tutte le possibili combinazioni tra 2 tabelle (prodotto cartesiano)
(Completo) Join esterno : http://www.w3schools.com/Sql/sql_join_full.asp
TLDR; Restituisce ogni riga in entrambe le tabelle e anche risultati con gli stessi valori (corrispondenze in CONDITION)
Un join esterno completo combina un join esterno sinistro e un join esterno destro. Il set di risultati restituisce righe da entrambe le tabelle in cui sono soddisfatte le condizioni ma restituisce colonne null in cui non esiste corrispondenza.
Un cross join è un prodotto cartesiano che non richiede alcuna condizione per unire le tabelle. Il set di risultati contiene righe e colonne che sono una moltiplicazione di entrambe le tabelle.
Ecco un esempio in cui sia FULL OUTER JOIN che CROSS JOIN restituiscono lo stesso set di risultati senza NULL restituito. Nota 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 righe interessate) (2 righe interessate) 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 righe interessate)
SQL JOIN COMPLETO ESTERNO
FULL OUTER JOIN restituisce tutte le righe dalla tabella di sinistra (tabella1) e dalla tabella di destra (tabella2) indipendentemente dalla corrispondenza.
La parola chiave FULL OUTER JOIN combina il risultato di 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 è mappata con ciascuna riga della seconda tabella.
Il numero di righe prodotte 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 è anche noto come prodotto cartesiano / join cartesiano
Numero di righe nella tabella A è m, Numero di righe nella tabella B è n e la tabella risultante avrà m * n righe
Riferimento: http://datasciencemadesimple.com/sql-cross-join/
FROM t1 FULL OUTER JOIN t2 ON t1.id=t2.id
sarà sempre più veloce diFROM t1,t2 WHERE t1.id=t2.id
?