2012-02-07 13 views
0

レコードが存在するかどうかをチェックしたいテーブルが1つあります。新しいローを挿入して前のローを更新しないと、それだけを残します。私はここで以下のようにマージを使用することができますか?同じターゲットとソーステーブルとのマージ

CREATE TABLE a 
    (keycol INT PRIMARY KEY, 
    col1 INT NOT NULL, 
    col2 INT NOT NULL, 
    col3 INT NOT NULL); 

INSERT INTO a VALUES (1,0,0,0),(2,0,0,0); 

MERGE INTO a 
USING select 1 from a where col1 = 3 
WHEN NOT MATCHED THEN 
UPDATE SET 
col2 = 2, 
col2 = 2, 
col3 = 2 
where col1 = 3 
WHEN NOT MATCHED THEN 
INSERT (keycol, col1, col2, col3) 
VALUES (4, 0, 0, 0) 

おかげで、

+0

は、第1の条件はする必要があります 'WHEN MATCHED' - あなたは、更新する行を持っていないとするときは何も質問をお読みください – JNK

+0

を挿入する必要がありますとき' MATCHED'はありません私が挿入して更新したい一致 – user570715

+1

私はそれを読んで、あなたの提案された解決策はナンセンスです。一致するものがない場合は、**何**を更新しますか?更新する行はありません。あなたはテーブルの他のすべての行を更新したいですか? – JNK

答えて

3
MERGE INTO a 
    USING (
      VALUES (3,3,2,2), 
       (4,0,0,0) 
     ) AS source (keycol, col1, col2, col3) 
    ON a.keycol = source.keycol 
     AND a.col1 = source.col1 
WHEN MATCHED THEN 
    UPDATE 
     SET col2 = source.col2, 
      col3 = source.col3 
WHEN NOT MATCHED THEN 
    INSERT (keycol, col1, col2, col3) 
     VALUES (keycol, col1, col2, col3); 
+0

これはIMHO正しい答えです - 少なくともそれは正確にこの質問のために私のために働く:) –

関連する問題