2015-11-24 20 views
5

以下、私は2つのテーブル#tempと#temp2を持っています。以下の例に基づいてクロス適用と内部結合の違い

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) 

そしてまた、私はINNERで 以下の2つのクエリの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 

結果:

col1 col1 
1  2 
2  4 
3  3 

そして、2番目のクエリは、CROSSで

が適用されます

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

結果:今

col1 col1 
1  2 
2  4 
3  3 
6  NULL 

、私が適用され、INNER JOINをCROSSの違いを知りたいです。私は知っているCROSS適用INNER JOINのように似ている#temp(最初のテーブル)の各レコードについては、クロス適用が実行されます。しかし、私は上記の結果セットに基づいて別の結果セットを取得しています。

ありがとうございます。

+0

右テーブル式に対応する一致がない行については、右テーブル式の列のNULL値を参照します。 CROSS APPLYは、意味的にINNER JOINと同等です(より正確には、相関サブクエリを持つCROSS JOINのように)。暗黙的な結合条件は1 = 1です。 –

+0

こちらをご覧ください:http://explainextended.com/2009/07/16/inner-join-vs-cross-apply/ – CM2K

+0

CROSS APPLYは、テーブル値関数の「結合」オプションを提供するように設計されています。 2つのテーブル/ビューで作業している場合、JOINを使用して['apply']を保存する方が適切です(https://technet.microsoft.com/en-us/library/ms175156(v=sql.105) ).aspx)キーワードを使用します。これにより、将来の拡張やバグ修正のための明快さと保守性が向上します。 – DeadZone

答えて

5

私の理解が間違っている場合は、ここで別の結果が得られる理由は、適用後に適用されるもの(右演算子)が左演算子(#temp)のすべての行に適用されるということです。つまり、結果の行数は#tempの行数と同じになります。 "テーブル値関数は右入力として機能し、外部テーブル式は左入力として機能します。右入力は左入力から各行について評価され、生成された行は最終出力用に結合されます。 " https://technet.microsoft.com/en-us/library/ms175156(v=sql.105).aspx

あなたは本当に結果があなたのクロスはこれにクエリを適用変えることができると同じになりたいと思った場合、その注:両方の一致がある場合

また
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 

、INNER JOINがあることに注意がなるように定義されます側面。あなたの場合、これは3行しかないことを意味します。代わりにLEFT OUTER結合を使用していた場合、CROSS APPLYと同じ結果が得られます。

+1

ありがとうございます。あなたの説明でNullを使って処理するときのCross Applyの動作を理解しました –

関連する問題