2016-10-19 10 views
0

ドンa SQL INSERT INTO ... SELECT FROM ... WHERE NOT EXISTSSQL:WHERE NOT EXISTSは実際に何をチェックしていますか?

実際にチェックする句は何ですか?私は(つまり、COL1が主キーである)、それはそのテーブルにない別のテーブルの「COL1」にテーブルからCOL1の結果を挿入することが

INSERT INTO <table> (<col1>) 
SELECT DISTINCT N.<col1> 
FROM N 
WHERE NOT EXISTS (
    SELECT 1 
    FROM <table> C 
    WHERE 
     N.<col1> = C.<col1> 
) 

それは私には思える願ってNOT EXISTS句のSELECT文は行(または複数の行)を返し、NOT EXISTSは0行またはゼロ以上の行を探します。

は正しいですか?

+4

それが0の行を探していません。すべての行を探します。行が存在する場合、EXISTSは真と評価されます。同様に、行が存在しない場合、NOT EXISTSはtrueと評価されます。 –

答えて

1

これに追加するだけで、WHERE句の選択または更新には、サポート対象のクエリで定義した内容に基づいて、EXCLUDEのレコードにNot Exist句を使用できます。あなたのケースのMERGEで

は良いですが、いくつかのケースでは、それ以下の例のようにも便利です。

If Not Exists (Select 1 From dbo.Activities Where ActivityId = 107 AND Activity = 'Facility Updated') 
    Begin 
    Insert Into Activities (ActivityId, Activity, CreateDt_GMT, CreatedBy, TimeZoneOffsetMins, ActionTypeId, IsTracked, IgnoreChildren, ProcessExtraInfomation, IgnoreNotChangedData, ApplicationID) 
    Values(107, 'Blah', GetDate(), 'SYSTEM', -300, 3, 1, 0, 1, 1, 1) 
    End 
2

存在しない場合は、わかりやすく、値がターゲット表に存在しない場合にのみ行を挿入します。

しかし、これは非常に混乱しやすい構文であり、私は同様の操作を行う必要があるときはいつでもMERGEを使用しようとします。

関連する問題