2014-09-30 89 views
0

讓說我有2個表插入/更新,合併與遞歸

DECLARE @BaseProducts TABLE (Id int) 
DECLARE @ConnectData TABLE (Id int, ACTION varchar(10)) 

我在@ConnectData一些數據,

INSERT INTO @ConnectData (Id, ACTION) 
VALUES (1, 'Insert') 
INSERT INTO @ConnectData (Id, ACTION) 
VALUES (1, 'Insert') 
INSERT INTO @ConnectData (Id, ACTION) 
VALUES (1, 'Insert') 

現在我想從@ConnectData更新@BaseProduct,所以我試了

MERGE @BaseProducts AS D 
USING (SELECT Id, ACTION FROM @ConnectData) S 
    ON D.Id = S.Id 
WHEN NOT MATCHED THEN 
    INSERT(Id) 
    VALUES(S.Id) 
WHEN MATCHED THEN 
UPDATE 
     SET Id = S.Id; 

但是這是插入3行。我想第一個應該插入和其他2應該更新。

回答

0

您正在以錯誤的方式處理此問題,合併報表應在NOT MATCHED之前有MATCHED的情況。

你在這裏試圖做什麼MERGE Statement不是正確的工具。你應該做一個獨特的插入這樣的事情..

也沒有看到更新ID與ID的點,因爲兩個值是相同的(因此你加入他們)。

INSERT INTO @BaseProducts (Id) 
SELECT t.Id 
FROM @ConnectData t 
WHERE NOT EXISTS (SELECT 1 
        FROM @BaseProducts 
        WHERE ID = t.Id) 
GROUP BY t.Id 
0

MERGE不通過MERGE本身對新插入的行進行操作。

要完成你所需要的,

您需要更新基礎上匹配狀態

MERGE @BaseProducts AS D 
USING (SELECT distinct Id, ACTION FROM @ConnectData) S 
    ON D.Id = S.Id 
WHEN MATCHED THEN 
UPDATE 
     SET Id = S.Id; 
基於不匹配的空表

MERGE @BaseProducts AS D 
USING (SELECT distinct Id, ACTION FROM @ConnectData) S 
    ON D.Id = S.Id 
WHEN NOT MATCHED THEN 
    INSERT(Id) 
    VALUES(S.Id); 

你可以做另一個MERGE插入不同的值