1

このコードが何をしているのかを誰かが理解するのを手伝ってくれるかどうか疑問に思っていました. 私は SQL スクリプトを継承しており、読みやすいようにコードを更新しようとしています。私は以下のコードを見てきましたが、これを行うためのより簡単な方法があるようですが、このコードが実際に何をしているのかについて頭を悩ませることはできません. このコードを説明するのを手伝ってくれる人はいますか? (おそらく、サブクエリまたは EXISTS を使用してこれを行う方法、またはこれを読むためのより簡単な方法を教えてください。

SELECT DISTINCT
    s.id
    ,f.FLAG1
    ,f.FLAG1
    ,f.FLAG1
INTO #DLK_TEMP
from Inner_Source D
    LEFT OUTER JOIN Outer_Source_1 S on D.au = S.AU 
        AND D.wcv_entity_key = S.wcv_entity_key 
    LEFT OUTER JOIN Outer_Source_2 F on S.id = F.id
WHERE S.id IS NOT NULL 
4

4 に答える 4

2

LEFT OUTER JOINonSを実行してから、結合が成功した行をテストしているのは奇妙に思えます。INNER JOIN代わりになるはずです。また、S.IDnull 許容でない場合は、WHERE句を削除することもできます。

SELECT DISTINCT
    s.id
    ,f.FLAG1
    ,f.FLAG1
    ,f.FLAG1
INTO #DLK_TEMP
FROM Inner_Source AS D
JOIN Outer_Source_1 AS S
    ON D.au = S.AU 
    AND D.wcv_entity_key = S.wcv_entity_key 
LEFT OUTER JOIN Outer_Source_2 AS F
ON S.id = F.id

必要に応じて、最初の結合をEXISTS句に変更して、結合がフィルターとしてのみ機能していることを明確にすることができます。

SELECT DISTINCT
    s.id
    ,f.FLAG1
    ,f.FLAG1
    ,f.FLAG1
INTO #DLK_TEMP
FROM Outer_Source_1 AS S
LEFT OUTER JOIN Outer_Source_2 AS F ON S.id = F.id
WHERE EXISTS
(
    SELECT *
    FROM Inner_Source AS D
    WHERE D.au = S.AU 
    AND D.wcv_entity_key = S.wcv_entity_key
)
于 2012-08-06T13:43:32.747 に答える
0

オプティマイザに結合するフィールドを具体的に指示するため、ほとんどの場合、結合はサブクエリよりも優れています。サブクエリは、オプティマイザによって結合に変更できる場合があります。同じパフォーマンスが得られる場合もありますが、インデックスが作成されていないO(n^2)検索になる場合もあります。

具体的にはInner_SourceOuter_Source_1and Outer_Source_2(具体的には外部結合、つまり、結合されたフィールドが一部のテーブルで欠落している場合でも行を取得することを意味します(最初の結合はほとんど内部結合ですが))と結合し、結果のデータセットから一時テーブルへのいくつかのフィールド#DLK_TEMP

結合はデータベースの設計とプログラミングの定番であるため、結合についてよく読んでおく必要があります。あなたのその質問は本当に非常に基本的です。

于 2012-08-06T13:46:55.797 に答える
0

これは、すべての個別の値(s.id、、、、組み合わせて個別)をf.FLAG1、と呼ばれる一時テーブルに選択します。取得するデータ(つまり、、、、)は、一意のキー( 、、 )を洞窟化する3つの異なるテーブルから取得されます。左側の結合はここで結合し、結合ステートメントの左側の値にプレゼンスを提供します。f.FLAG1f.FLAG1#DLK_TEMPs.idf.FLAG1f.FLAG1f.FLAG1Inner_SourceOuter_Source_1Outer_Source_2

左外部結合には、2番目(右)のテーブルのレコードに一致する値がない場合でも、2つのテーブルの最初(左)のすべてのレコードが含まれることに注意してください。

これがお役に立てば幸いです。

于 2012-08-06T13:47:31.387 に答える
0
INTO #DLK_TEMP

二重にエキサイティングな外部結合を挿入する一時テーブル (接続が閉じられると破棄される) です。

于 2012-08-06T13:43:25.243 に答える