SQL MERGE INTO - 如何删除然后插入匹配/现有数据?

时间:2015-12-22 13:20:20

标签: sql-server tsql stored-procedures merge

我目前有一个存储过程,可以将目标表(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时,有人能告诉我如何一个接一个地删除和插入吗?

3 个答案:

答案 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)