我目前有一个存储过程,可以将目标表(Ticket_Report)与我的数据源表(New_Tickets)进行比较。
我使用MERGE INTO语句来比较这两个。当它在两个表之间找到匹配时,它会使用源表中的相应信息更新目标表中的当前行。如果它找到匹配项,它会将源表中的数据插入到目标表中。
MERGE INTO Ticket_REPORT T1
USING @New_Tickets T2
ON T1.TICKET_NO=T2.TICKET_NO
WHEN MATCHED THEN
UPDATE SET
T1.TICKET_NO = T2.TICKET_NO,
T1.ASSIGNED_GROUP = T2.ASSIGNED_GROUP,
T1.ASSIGNEE = T2.ASSIGNEE,
T1.FNAME = T2.FNAME,
T1.LNAME = T2.LNAME
WHEN NOT MATCHED THEN
INSERT VALUES(
T2.TICKET_NO,
T2.ASSIGNED_GROUP,
T2.ASSIGNEE,
T2.FNAME,
T2.LNAME
);
我需要做的是,当我找到MATCH时,而不是仅仅更新行,我需要删除该行,然后将其重新插入目标表。每当我找到一个MATCH时,有人能告诉我如何一个接一个地删除和插入吗?
答案 0 :(得分:4)
以下是一个例子:
DECLARE @t1 TABLE(id INT IDENTITY, col1 INT)
DECLARE @t2 TABLE(id INT IDENTITY, col1 INT, old_col1 INT)
INSERT INTO @t1(col1) VALUES(5), (10), (15)
INSERT INTO @t2(col1) VALUES(7), (14), (21), (28)
MERGE INTO @t2 t2
USING @t1 t1 ON t1.id = t2.id
WHEN MATCHED THEN DELETE
WHEN NOT MATCHED THEN INSERT VALUES(t1.col1, NULL)
OUTPUT t1.col1, Deleted.col1 INTO @t2(col1, old_col1);
SELECT * FROM @t2
ORDER BY id
输出:
id col1 old_col1
4 28 NULL
5 5 7
6 10 14
7 15 21
前三行在两者中都有相同的ID,因此匹配部分将删除那些(7,14,21)。 28将保留。并且您在OUTPUT
子句中插入新值并保留旧值。
答案 1 :(得分:0)
@Giorgi,这不能完全正常工作。 如果您@ t1的行多于@ t2,则将有重复行。
DECLARE @t1 TABLE(id INT IDENTITY, col1 INT)
DECLARE @t2 TABLE(id INT IDENTITY, col1 INT, old_col1 INT)
INSERT INTO @t1(col1) VALUES(5), (10), (15), (20), (25)
INSERT INTO @t2(col1) VALUES(7), (14), (21), (28)
MERGE INTO @t2 t2
USING @t1 t1 ON t1.id = t2.id
WHEN MATCHED THEN DELETE
WHEN NOT MATCHED THEN INSERT VALUES(t1.col1, NULL)
OUTPUT t1.col1, Deleted.col1 INTO @t2(col1, old_col1);
SELECT * FROM @t2
ORDER BY id
id col1 old_col1
5 25 NULL
6 25 NULL
7 5 7
8 10 14
9 15 21
10 20 28
答案 2 :(得分:0)
最简单的方法是运行2次
DECLARE @t1 TABLE(id INT IDENTITY, col1 INT)
DECLARE @t2 TABLE(id INT IDENTITY, col1 INT, old_col1 INT)
INSERT INTO @t1(col1) VALUES(5), (10), (15), (20), (25)
INSERT INTO @t2(col1) VALUES(7), (14), (21), (28)
-首次运行;
MERGE INTO @t2 t2
USING @t1 t1 ON t1.id = t2.id
WHEN MATCHED THEN DELETE
-第二次运行;
MERGE INTO @t2 t2
USING @t1 t1 ON t1.id = t2.id
WHEN NOT MATCHED THEN INSERT VALUES(t1.col1, NULL)