我遇到需要将数据从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情况下不允许更新。
请告知。
谢谢。
答案 0 :(得分:4)
我想我现在明白了这些要求。你想更新table2中id匹配的记录,但ahccs没有,将标志设置为'z'。另外,对于这些不匹配,应该在table2中插入一个新行,其中包含相同的id,但是来自table1的ahcc,以及一个'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