1

table1 から table2 にデータを挿入する必要がある状況があります。挿入する前に、特定の行が table2 に既に存在するかどうかを確認してください。

条件は次のとおりです。1) id と ahccs の値が両方のテーブルで同じである場合、何もしません。2) id の値は同じですが、ahccs が異なる場合、フラグ ='z' を設定し、新しい ahccs 値で同じ id を挿入します。

SQLSERVER 2008 R2 を使用しています。どうすればこれを達成できますか?

私はこのようなものが必要かもしれません。

DECLARE @table1 TABLE 
(id int not null, ahccs int not null, info varchar(25), flag varchar(2))
DECLARE @table2 TABLE 
(id int not null, ahccs int not null, info varchar(25), flag varchar(2))

INSERT INTO @table1
VALUES(1, 1223, 'et', 'X')
INSERT INTO @table1
VALUES(2, 321, 'et', 'X')
INSERT INTO @table1
VALUES(3, 134, 'et', 'X' )
INSERT INTO @table1
VALUES(4, 168, 'et', 'X' )
INSERT INTO @table1
VALUES(5, 123, 'et', 'X' )


INSERT INTO @table2
VALUES(1, 1223, 'dt', 'y' )
INSERT INTO @table2
VALUES(2, 456, 'dt', 'y' )
INSERT INTO @table2
VALUES(3, 123, 'dt', 'y' )
INSERT INTO @table2
VALUES(4, 193, 'dt', 'y' )
--SELECT * FROM @table1

SELECT * FROM @table2



MERGE
INTO    @table2 t2
USING   @table1 t1
ON      t2.id = t1.id 
WHEN MATCHED AND t2.ahccs != t1.ahccs THEN
UPDATE
SET     flag = 'z'
INSERT VALUES (t2.id, t1.ahccs, t1.info, 'l');

私が抱えている 2 つの問題は次のとおりです。1) Merge は複数のステップをサポートしていないと思います。2) WHEN NOT MATCHED の場合、更新は許可されません。

お知らせ下さい。

ありがとうございました。

4

1 に答える 1

4

これで要件が理解できたと思います。ID は一致するが ahccs が一致しない table2 のレコードを更新し、フラグを「z」に設定します。さらに、これらの不一致については、新しい行を table2 に挿入する必要があります。ID は同じですが、table1 の ahccs と「l」のフラグを使用します。

DECLARE @tmp TABLE (id int, ahccs int, info varchar(25), flag varchar(2))
MERGE
INTO    @table2 t2
USING   @table1 t1
ON      t2.id = t1.id
WHEN NOT MATCHED THEN
    INSERT VALUES (t1.id, t1.ahccs, t1.info, t1.flag)
WHEN MATCHED and t2.ahccs <> t1.ahccs THEN
    UPDATE SET flag = 'z'
output inserted.id, t1.ahccs, t1.info, inserted.flag
into @tmp;

insert into @table2
select id, ahccs, info, 'l' as flag
from @tmp
where flag = 'z' -- don't insert what we've already inserted
于 2012-04-26T15:53:14.303 に答える