1

我有一种情况,我需要将数据从 table1 插入 table2。在插入之前检查 table2 中是否已经存在某行。

条件是如果: 1) id 和 ahccs 的值在两个表中是相同的,那么什么都不做。2) id 的值相同但 ahccs 不同,然后设置 flag ='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');

我遇到的两个问题是:1)我相信合并不支持多个步骤。2) WHEN NOT MATCHED 情况下不允许更新。

请指教。

谢谢你。

4

1 回答 1

4

我想我现在明白了要求。您想更新 table2 中 id 匹配但 ahccs 不匹配的记录,将标志设置为“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 回答