2015-12-22 70 views
2

我目前有一個存儲過程,將我的目標表(Ticket_Report)與我的數據源表(New_Tickets)進行比較。SQL MERGE INTO - 如何刪除然後插入匹配的/現有的數據?

我正在使用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 
); 

我需要做的是,當我找到一個匹配,而不是隻更新該行,我需要刪除該行,並重新插入到目標表中。任何人都可以告訴我如何同時刪除和插入一個接一個找到匹配嗎?

回答

1

下面是一個例子:

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子句中。

+0

我能夠捕獲OUTPUT中的刪除行,然後INTO作爲插入語句工作嗎? – Reeggiie

+0

@Reeggiie,是的。該示例演示了這一點。 –

相關問題