2015-11-24 9 views
5

Di seguito sono riportate due tabelle #temp e # temp2.Differenza tra cross apply e inner join sulla base dell'esempio sottostante

create table #temp 
    (
    col1 int 
    ) 

    insert into #temp values(6),(1),(2),(3),(null) 



    create table #temp2 
    (
     col1 int 
     ) 
     insert into #temp2 values(1),(2),(1),(2),(3),(null) 

e anche io ho due domande qui sotto con INNER JOIN:

SELECT t1.col1, 
      Sum(t2.col1) AS col1 
    FROM #temp t1 
      INNER JOIN #temp2 t2 
        ON t1.col1 = t2.col1 
    GROUP BY t1.col1 

Risultato:

col1 col1 
1  2 
2  4 
3  3 

Ed seconda query è

con croce applica:

SELECT * 
FROM #temp t1 
     CROSS apply (SELECT Sum(col1) AS col1 
        FROM #temp2 t2 
        WHERE t1.col1 = t2.col1) A 

Risultato:

col1 col1 
1  2 
2  4 
3  3 
6  NULL 

Ora, voglio sapere la differenza tra CROSS applicare e INNER JOIN. Conosco CROSS APPLY simile a INNER JOIN Per ogni singolo record di #temp (prima tabella) cross verrà eseguito.Ma sto ottenendo diversi risultati in base ai set di risultati sopra indicati. Qualcuno può spiegare?

Grazie in anticipo.

+0

Per le righe per le quali non vi sono corrispondenze corrispondenti nell'espressione della tabella di destra, verranno riferiti i valori NULL nelle colonne dell'espressione della tabella di destra. La CROSS APPLY è semanticamente equivalente a INNER JOIN (o per essere più precisi è come un CROSS JOIN con una sottoquery correlata) con una condizione di join implicita di 1 = 1. –

+0

vedere questo: http://explainextended.com/2009/07/16/inner-join-vs-cross-apply/ – CM2K

+0

CROSS APPLY è stato progettato per offrire un'opzione "join" per le funzioni con valori di tabella. Quando si lavora con due tabelle/viste, sarebbe più appropriato utilizzare JOINs e salvare ['apply'] (https://technet.microsoft.com/en-us/library/ms175156 (v = sql.105) .aspx) parola chiave per le funzioni con valori di tabella. Ciò promuoverà chiarezza e manutenibilità per futuri miglioramenti o correzioni di bug. – DeadZone

risposta

5

Se la mia comprensione della croce si applica è corretta la ragione per cui si ottengono risultati diversi qui è che APPLICAZIONE CROSS applicherà ciò che viene dopo l'applicazione (l'operatore giusto) a ogni riga nell'operatore di sinistra (#temp). Ciò significa che il numero di righe nel risultato sarà uguale al numero di righe in #temp. Basando la mia risposta su "La funzione con valori di tabella funge da input corretto e l'espressione della tabella esterna funge da input sinistro. L'input destro viene valutato per ogni riga dall'input sinistro e le righe prodotte vengono combinate per l'output finale. " da https://technet.microsoft.com/en-us/library/ms175156(v=sql.105).aspx.

Si noti che se si voleva davvero i risultati per essere lo stesso si potrebbe cambiare la tua croce applicare query per questo:

SELECT * 
FROM #temp t1 
     CROSS apply (SELECT Sum(col1) AS col1 
        FROM #temp2 t2 
        WHERE t1.col1 = t2.col1) A 
WHERE A.col1 IS NOT NULL 

Si noti inoltre che INNER JOIN è definito come dove c'è una partita in entrambi i lati. Nel tuo caso questo significa che c'erano solo 3 righe. Se avessi usato un join LEFT OUTER, avresti ottenuto gli stessi risultati in questo caso come il CROSS APPLY.

+1

Grazie. Ho capito il comportamento di Cross Apply quando gestisco con Nulls con la tua Spiegazione –