2017-08-03 12 views
1

現在、照会が実行されているデータベースにアクセスすることなく照会を検討しています。 (それは理想的ではありませんが、それは私が任されていることです)。私はSQLの専門家ではなく、クエリを実行できないため、以下のコードが何をしているかを特定しようとしています。それは同じtempテーブルから読み書きしています(?を複製しています)。私は 'Y'の出所が何であるか、最終結果が何であるか分かりません。どんな助けもありがとうございます。ありがとうございました。SQL照会の解読

INSERT INTO #temp1 
    SELECT X.CURSTATUS ,X.GENDER ,Y.PACKAGE ,X.AGE ,1 AS factor1 ,1 AS factor2; 
FROM #temp1 X WITH (NOLOCK) , 
    (SELECT 'P1' AS PACKAGE UNION ALL SELECT 'P2') Y 
WHERE X.PACKAGE = 'P5'; 

答えて

2

それは同じテーブルにを書いて本当にではありません。同じテーブルに行を「追加」しています。つまり、テーブル内の既存のデータは影響を受けません。

これは、すべての "P5"パッケージに対してパッケージ "P1"と "P2"の行を追加することです。これにより、テーブルに新しい行が追加されます。 「P5」行が残る。

+0

ゴードンさんありがとうございました。 – Run3Pal

1
INSERT INTO #temp1 

- これは、データが挿入される場所です。これはところで、明示的に定義された列を持っている必要があり、このフォーマットは、SQLアンチパターン

SELECT X.CURSTATUS ,X.GENDER ,Y.PACKAGE ,X.AGE ,1 AS factor1 ,1 AS factor2; 
FROM #temp1 X WITH (NOLOCK) , 

である - これは

 (SELECT 'P1' AS PACKAGE UNION ALL SELECT 'P2') Y 

-Y-が1列に2つのレコードのテーブルである#TEMPから現在の行を選択しています特定の結合が表示されていないので、それはクロス結合です - 反パターン化しても、クロス結合キーワードを明示的に使用して、何が起こっているのかを明確にする方がはるかに優れています。

WHERE X.PACKAGE = 'P5'; 

- これは#tempのレコードをフィルタリングし、レコードの値が 'P5'のレコードのみを取得します。 2レコードテーブルYにクロスジョインするので、P%レコードの他の列のデータを取り込み、P1およびP2の新しいレコードを挿入します。 10個のP5レコードがある場合、この挿入は10個のP1レコードと10個のP2レコードを挿入します。

+0

ありがとうHLGEM – Run3Pal

2

PACKAGEの値が "P5"の#tempの各行について、PACKAGEの値が "P1" & "P2"の2つの新しい行がクエリに挿入されています。

クエリを再フォーマットし、古い構文をモデム構文に置き換えると、わかりやすくなります。

INSERT INTO #temp1 (CURSTATUS, GENDER, PACKAGE, AGE, factor1, factor2) 
SELECT 
    X.CURSTATUS, 
    X.GENDER, 
    Y.PACKAGE, 
    X.AGE, 
    1 AS factor1, 
    1 AS factor2 
FROM 
    #temp1 X 
    CROSS JOIN ( 
       SELECT 'P1' AS PACKAGE 
       UNION ALL 
       SELECT 'P2' 
       ) Y 
WHERE 
    X.PACKAGE = 'P5'; 
+0

ありがとうJason – Run3Pal

+0

ようこそ。 :) –