2011-11-22 13 views
5

主キーが一致し、アクティブな 'Y'レコードを挿入した行がない場合は、次の操作を行います。これは可能ですか?マージステートメントには存在しませんか?

私はこれを試してみました:

-- Merge statement 
MERGE INTO table1 AS DST 
USING table2 AS SRC 
ON (SRC.Code = DST.Code) 

--Existing records updated if data changes 
WHEN MATCHED 
AND IF NOT EXISTS (WHERE active='Y' FROM table1) 

THEN 
INSERT INTO table1 (colum) 
SELECT value 

+-------+-------------+--------+ 
| Code | description | Active | 
+-------+-------------+--------+ 
| AB | just  | | 
|  | something | No  | 
+-------+-------------+--------+ 

同じコードでアクティブなレコードが存在しない場合にのみ、私はレコードを挿入します。新しいレコードが、私はそれが

編集それがより明確に願っています。この

+-------+-------------+--------+ 
| Code | description | Active | 
+-------+-------------+--------+ 
| AB | something | | 
|  | else  | YES | 
+-------+-------------+--------+ 

次のようになります。そのことはできない気にしないで、私はこのエラーメッセージが表示されました: はタイプのアクションは、「INSERTは」ではありませんMERGEステートメントの 'WHEN MATCHED'節で許可されています。

+1

これは作品をマージする方法はありません。従来のIFを使用することを検討してください。 – Toby

+0

テーブル構造のサンプルデータと期待される最終結果は、あなたの質問を理解し、答えを出すのに役立ちます。 –

+0

投稿を編集する際に問題がありましたが、現在サンプルデータがあります – R2D2

答えて

5

私が正しく理解していれば、@T2からまだ@T1にない行を挿入してください。Active = 'y'です。

declare @T1 table 
(
    Code char(2), 
    Descr varchar(10), 
    Active char(1) 
) 

declare @T2 table 
(
    Code char(2), 
    Descr varchar(10) 
) 

insert into @T1 values 
('1', 'Desc 1', 'y'), 
('2', 'Desc 2', 'n') 

insert into @T2 values 
('1', 'Desc 1'), 
('2', 'Desc 2'), 
('3', 'Desc 3') 

merge @T1 as D 
using @T2 as S 
on D.Code = S.Code and 
    D.Active = 'y' 
when not matched then 
    insert (Code, Descr, Active) 
    values (Code, Descr, 'y'); 

select * 
from @T1 

結果:コード3と

Code Descr  Active 
---- ---------- ------ 
1 Desc 1  y 
2 Desc 2  n 
2 Desc 2  y 
3 Desc 3  y 

行も挿入されます。あなたがそれを望んでいない場合は、に行を挿入するだけで、@T2の行にすでにコードが一致している場合は、Active = 'n'という行が挿入されます。

merge @T1 as D 
using (select Code, 
       Descr 
     from @T2 
     where Code in (select Code 
         from @T1 
         where Active = 'n')) as S 
on D.Code = S.Code and 
    D.Active = 'y' 
when not matched then 
    insert (Code, Descr, Active) 
    values (Code, Descr, 'y'); 

結果:

Code Descr  Active 
---- ---------- ------ 
1 Desc 1  y 
2 Desc 2  n 
2 Desc 2  y 
+0

ありがとうございました!あなたの2番目のスクリプトは私が必要としたものでした。あなたが選択を使用した場所だけが必要ではなかったので、私はそれを残して、それがどのように動作したいかを動作させる=) – R2D2

関連する問題