2017-02-13 13 views
0

私は以下のデータを持つテーブルを持っています。行が存在しない場合のみSQL挿入

TABLE_1

ID, GROUP_ID, ARTIFACT_ID, VERSION 
101, com.abc, pqra, 1.0.0 
102, com.abc, pqrb, 2.0.0 
103, com.abc, pqrc, 3.0.0 
104, com.abc, pqrd, 4.0.0 

Table_2

ID, MODULE_ID, ISSUE_KEY 
11, 104, XYZ-12 
12, 104, XYZ-34 

私はTable_2に値を挿入するには、次のコマンドを使用しています。

あなたは上記のクエリから推測できるように、私が最初に与えられた GROUP_IDARTIFACT_IDVERSION値をTABLE_1から IDを取得しようとし、その後 XYZ-56として取り出さ IDISSUE_KEY値でTABLE_2にデータを挿入しています
INSERT INTO Table_2 (MODULE_ID, ISSUE_KEY) SELECT ID, 'XYZ-56' FROM Table_1 
WHERE Table_1.GROUP_ID = 'com.abc' AND Table_1.ARTIFACT_ID = 'pqrd' AND 
Table_1.VERSION = '4.0.0' 

。 上記のコマンドを実行した後、Table_2は

ID, MODULE_ID, ISSUE_KEY 
11, 104, XYZ-12 
12, 104, XYZ-34 
13, 104, XYZ-56 

ようになり、上記INSERTクエリに伴う問題は、それが既にMODULE_IDISSUE_KEYの特定の値で指定された行が存在するかどうかをチェックしないことです。私は再び同じINSERTクエリを実行した場合、その表は

ID, MODULE_ID, ISSUE_KEY 
11, 104, XYZ-12 
12, 104, XYZ-34 
13, 104, XYZ-56 
14, 104, XYZ-56 

のようになります。私は、行が与えられたMODULE_IDISSUE_KEYで既に存在している何の行が存在しないだけのTable_2に挿入することにしたいです。
上記の挿入クエリを変更して、期待どおりに処理するのに役立つ人がいますか。

+0

ここのような使用はありませんhttp://stackoverflow.com/a/41186684/2562699 – whereisSQL

答えて

1

あなたはWHERE NOT EXISTSでそれを行うことができます:

Insert Into Table_2 (MODULE_ID, ISSUE_KEY) 
Select ID, 'XYZ-56' 
From Table_1 T1 
Where T1.GROUP_ID = 'com.abc' 
And  T1.ARTIFACT_ID = 'pqrd' 
And  T1.VERSION = '4.0.0' 
And Not Exists 
(
    Select * 
    From Table_2 T2 
    Where T2.Module_Id = T1.Id 
    And  T2.Issue_Key = 'XYZ-56' 
); 

ここCTELEFT JOINを使用して別の方法です:

;With ToInsert As 
(
    Select ID As Module_Id, 'XYZ-56' As Issue_Key 
    From Table_1 T1 
    Where T1.GROUP_ID = 'com.abc' 
    And  T1.ARTIFACT_ID = 'pqrd' 
    And  T1.VERSION = '4.0.0' 
) 
Insert  Table_2 
      (Module_Id, Issue_Key) 
Select  I.Module_Id, I.Issue_Key 
From  ToInsert I 
Left Join Table_2  T2 On T2.Module_Id = I.Module_Id 
          And T2.Issue_Key = I.Issue_Key 
Where  T2.Id Is Null; 
0

あなたはレコードが存在するかどうかを確認するために、次のような場合はブロックを使用することができますまたは:

IF NOT EXISTS (SELECT * FROM Table_2 WHERE ISSUE_KEY = 'XYZ-56') 
BEGIN 

INSERT INTO Table_2 (MODULE_ID, ISSUE_KEY) SELECT ID, 'XYZ-56' FROM Table_1 
WHERE Table_1.GROUP_ID = 'com.abc' AND Table_1.ARTIFACT_ID = 'pqrd' AND 
Table_1.VERSION = '4.0.0' 

END 
0

except

INSERT INTO Table_2 (MODULE_ID, ISSUE_KEY) 
SELECT ID, 'XYZ-56' 
FROM Table_1 
WHERE Table_1.GROUP_ID = 'com.abc' 
    AND Table_1.ARTIFACT_ID = 'pqrd' 
    AND Table_1.VERSION = '4.0.0' 

except 
select MODULE_ID, ISSUE_KEY 
from Table_2 

又はnot exists()

INSERT INTO Table_2 (MODULE_ID, ISSUE_KEY) 
SELECT ID, 'XYZ-56' 
FROM Table_1 
WHERE Table_1.GROUP_ID = 'com.abc' 
    AND Table_1.ARTIFACT_ID = 'pqrd' 
    AND Table_1.VERSION = '4.0.0' 
    and not exists (
    select 1 
    from table_2 as i 
    where i.Module_ID = table_1.ID 
     and i.Issue_Key = 'XYZ-56' 
) 

又は他の同様の方法。

+0

「例外」を使用すると重複は削除されることが望ましいかもしれませんが、これはまた、追加の不要な処理を行うことを示唆しています。 –

+0

@GordonLinoffそれは本当です、それは重複を削除します。また、等しいかどうかをチェックするときに、異なる値で 'null'値を処理します。 – SqlZim

0

Mergeを検索しています。

引用ドキュメント:

行うが、挿入、更新、またはソーステーブルとの結合の結果に基づいて、ターゲット表の操作を削除します。たとえば、あるテーブルの行を挿入、更新、または削除することによって、2つのテーブルを同期させることができます。

注:パフォーマンスに関するヒントを注意深く読んでください。

関連する問題