2010-07-12 18 views

risposta

175

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.

+0

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

+0

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

+0

È "outer join" più veloce o "cross join"? – Shafizadeh

14

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

16

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.

+2

Questi limiti escludono le possibili partite 1-molti? Un join esterno completo è ancora in grado di produrre righe (M x N). – maxwellb

+1

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

+1

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

3

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) 
*/ 
44

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.

+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. –

1

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)

6

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 a Cartesian Product number.

Numero di righe restituite da FULL OUTER JOIN uguale a (n di righe da LEFT OUTER JOIN) + (Numero di righe RIGHT OUTER JOIN) - (Numero di righe INNER JOIN).

1

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

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

  • SQL full outer join è noto anche come unione completa

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/

Problemi correlati