2011-02-16 9 views
0

ソーステーブルからターゲットテーブルにデータをロードするシナリオがあります。ソースからのデータがターゲットに存在しない場合は、挿入する必要があります。すでにターゲット表に存在する場合は、行のステータスを「期限切れにする」ように更新し、その列を新しい行として挿入します。私はこれを行うには、マージクエリを使用します。私は存在しない場合は挿入を行うことができ、私も更新を行うことができます。しかし、一致したときに挿入しようとしているとき、 '一致した'句には挿入が許可されていません。 事前SQL Server 2008のマージクエリ

+0

あなたが既に持っているものを見せてください!あなたのテーブルがどのように見えるか説明してください! –

答えて

0

ソースデータの単一行に対して複数のアクションを実行する場合は、その行を何らかの形で複製する必要があります。

(テーブル名などを構成する)は、次のような何か:

;WITH Source as (
    SELECT Col1,Col2,Col3,t.Dupl 
    FROM SourceTable,(select 0 union all select 1) t(Dupl) 
) 
MERGE INTO Target t 
USING Source s ON t.Col1 = s.Col1 and s.Dupl=0 /* Key columns here */ 
WHEN MATCHED THEN UPDATE SET Expired = 1 
WHEN NOT MATCHED AND s.Dupl=1 THEN INSERT (Col1,Col2,Col3) VALUES (s.Col1,s.Col2,s.Col3); 

そうでない場合は、ソースの行が任意のターゲット列が一致しないので、あなたは常に、一致していない枝にs.Dupl条件をしたいです2回挿入される。あなたは、私が変更したい、コメントとして投稿の例から


MERGE target AS tar USING source AS src ON src.id = tar.id 
WHEN MATCHED THEN UPDATE SET [email protected], C_IS_ACTIVE='N', [email protected] 
WHEN NOT MATCHED THEN INSERT (col1,col2,col3) VALUES (tar.col1,tar.col2,tar.col3); 

へ:

;WITH SourceDupl AS (
    SELECT id,col1,col2,col3,t.Dupl 
    FROM source,(select 0 union all select 1) t(Dupl) 
) 
MERGE target AS tar USING SourceDupl as src on src.id = tar.id AND Dupl=0 
WHEN MATCHED THEN UPDATE SET [email protected], C_IS_ACTIVE='N', [email protected] 
WHEN NOT MATCHED AND Dupl=1 THEN INSERT (col1,col2,col3) VALUES (src.col1,src.col2,src.col3); 

私は以来、VALUES句で値を変更しましたNOT MATCHEDブランチでは、tarテーブルには値を選択する行がありません。

+0

初めてデータを挿入するときに 'WHERE NOT MATCHED'を実行することができます。次回は、データが存在するときに更新を実行し、挿入するために、あなたが以前に宣言した同じ 'WHEN NOT MATCHED'節を使用したいと望む場合...マージは2 'WHEN NOT MATCHED'節を許可しませんか?私は何かを 'WHEN NOT MATCHED'句を区別することができますか –

+0

@ user549903 - あなたが今何を求めているのか分かりません。私が示したステートメントでは、ターゲット表に一致する行がある場合、UPDATEとINSERTの両方が発生します。 –

+0

MERGEターゲットAS tarソースを使用してソースをsrc.id = tar.idに更新したときD_VALID_TO = @ nowdate-1、C_IS_ACTIVE = 'N'、D_LAST_UPDATED_DATE = @ nowdate INSERT(col1、col2、 col3) VALUES(tar.col1、tar.col2、tar.col3); –

0

のおかげでは、それらの多くのリンクのいずれかのチェックアウト..私を助けてください:実際に何を知らなくても

をあなたのデータベーステーブルl私たちはもっと助けになることはできません - あなたはそれらの記事を読んで、あなたの具体的な状況にこれを適用する方法を理解する必要があります。