SQL Server: qual è la differenza tra CROSS JOIN e FULL OUTER JOIN?


Risposte:


243

Un cross join produce un prodotto cartesiano tra le due tabelle, restituendo tutte le possibili combinazioni di tutte le righe. Non ha onclausole perché stai unendo tutto a tutto.

A full outer joinè una combinazione di a left outere right outerjoin. Restituisce tutte le righe in entrambe le tabelle che corrispondono alla whereclausola della query e nei casi in cui la oncondizione non può essere soddisfatta per quelle righe, inserisce i nullvalori 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.


Quindi in caso di grandi tavoli FROM t1 FULL OUTER JOIN t2 ON t1.id=t2.id sarà sempre più veloce di FROM t1,t2 WHERE t1.id=t2.id?
alexkovelsky,

I join interni di @alexkovelsky sono spesso più veloci quando ci sono poche corrispondenze tra le due tabelle, poiché l'uso degli indici significa che non disturba la lettura di tutte le righe su una delle tabelle. un join esterno completo deve sempre leggere tutte le righe in entrambe le tabelle (o gli indici pertinenti). Nel caso in cui gli indici non siano sufficienti o un heap sottostante debba essere letto per produrre le colonne necessarie, un join esterno completo è quasi sempre più lento di un join interno.
Andrew Hill,

1
È outer joinpiù veloce o cross join?
Shafizadeh,

2
@Shafizadeh - Fanno cose diverse.
Donnie,

9
Che cosa succede se FULL OUTER JOIN su True? il risultato / le prestazioni saranno simili a un CROSS JOIN?
architettonico l'

65

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.


32

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.


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

1
seleziona COUNT_BIG (*) FROM Traffic t CROSS JOIN Destinatario r e SELECT COUNT_BIG (*) FROM Traffic t FULL JOIN Destinatario r ON (1 = 1) sono uguali.
urlreader

2
La tua è la migliore risposta reale. In sostanza: a cross joinmoltiplica le tabelle; a full outer joinli aggiunge nel peggiore dei casi, a seconda di quante righe corrispondono ..
Brian Peterson,

Sì. Stavo cercando questa matematica - produci dalle righe MAX (M, N) a (M + N) .. Grazie votato.
Arup Rakshit,

1
Questo è sbagliato. Le righe FULL JOIN ON sono le righe INNER JOIN ON UNION ALL righe senza corrispondenza della tabella sinistra con estensione null UNION ALL righe della tabella con estensione senza corrispondenza null con estensione null. Quindi FULL JOIN può restituire righe M * N - probabilmente maggiori di MAX (M, N) e M + N. Tuttavia, il numero minimo e massimo di righe restituite in funzione di M & N non è utile . Ciò che è utile è una chiara definizione di FULL JOIN ON - in termini di INNER JOIN ON e righe senza eguali.
Philipxy,

15

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


15

Per SQL Server, CROSS JOIN and FULL OUTER JOINsono diversi. CROSS JOINè semplicemente un prodotto cartesiano di due tabelle, indipendentemente da qualsiasi criterio di filtro o condizione.

FULL OUTER JOINfornisce un set di risultati univoco LEFT OUTER JOIN and RIGHT OUTER JOINdi 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 JOINrestituirà 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 FULL OUTER JOINuguale a (N. di righe per LEFT OUTER JOIN) + (N. di righe per RIGHT OUTER JOIN) - (N. di righe per INNER JOIN).


8

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

1
Ottimo esempio!
Lucas925,

1
grazie per l'esempio di dati reali. questo lo rende più chiaro.
dtc,


2

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.


1

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)

1

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

  • Il join esterno completo SQL è anche noto come FULL 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/

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.