2011-01-24 95 views
8

基本上我有一個SQL Server 2008 R2數據庫。數據庫有一個名爲節點和鏈接的表。鏈接包含與節點中的Id相關的StartNodeId和EndNodeId。該數據庫還需要Node和Link之間的鏈接表,以便更快速地檢查,例如,與此鏈接相關的此節點或與此鏈接有關的哪些節點。鏈接表包含一個身份密鑰,NodeId和LinkId。我的問題是,當我做我插入我試圖使用合併這似乎不能夠做什麼,我想合併到多個更新並插入

語句當我試圖

MERGE INTO [RoadRoutingDatabase].[dbo].[NodeToLink] AS TARGET 
USING (SELECT Id, StartNodeId, EndNodeId FROM [RoadRoutingDatabase].[dbo].[Link]) AS SOURCE 
ON (TARGET.LinkId = SOURCE.Id) 
WHEN MATCHED AND TARGET.NodeId = Source.StartNodeId THEN 
    UPDATE SET TARGET.NodeId = SOURCE.StartNodeId, 
       TARGET.LinkId = SOURCE.Id 
WHEN MATCHED AND TARGET.NodeId = Source.EndNodeId THEN 
    UPDATE SET TARGET.NodeId = SOURCE.EndNodeId, 
       TARGET.LinkId = SOURCE.Id 
WHEN NOT MATCHED BY TARGET AND TARGET.NodeId = Source.StartNodeId THEN 
    INSERT (LinkId, NodeId) 
    VALUES (SOURCE.Id, SOURCE.StartNodeId) 
WHEN NOT MATCHED BY TARGET AND TARGET.NodeId = Source.EndNodeId THEN 
    INSERT (LinkId, NodeId) 
    VALUES (SOURCE.Id, SOURCE.EndNodeId) 
WHEN NOT MATCHED BY SOURCE THEN 
    DELETE; 

我得到錯誤信息「一類型'WHEN MATCHED'的動作不能在MERGE語句的'UPDATE'子句中出現超過一次「

如果我嘗試插入開始節點和結束節點,例如

--Insert Start Node To Link Relationships 
    MERGE INTO [RoadRoutingDatabase].[dbo].[NodeToLink] AS TARGET 
    USING (SELECT Id, StartNodeId FROM [RoadRoutingDatabase].[dbo].[Link]) AS SOURCE 
    ON (TARGET.NodeId = SOURCE.StartNodeId AND TARGET.LinkId = SOURCE.Id) 
    WHEN MATCHED THEN 
     UPDATE SET TARGET.NodeId = SOURCE.StartNodeId, 
        TARGET.LinkId = SOURCE.Id 
    WHEN NOT MATCHED BY TARGET THEN 
     INSERT (LinkId, NodeId) 
     VALUES (SOURCE.Id, SOURCE.StartNodeId) 
    WHEN NOT MATCHED BY SOURCE THEN 
     DELETE; 

    --Insert End Node To Link Relationships 
    MERGE INTO [RoadRoutingDatabase].[dbo].[NodeToLink] AS TARGET 
    USING (SELECT Id, EndNodeId FROM [RoadRoutingDatabase].[dbo].[Link]) AS SOURCE 
    ON (TARGET.NodeId = SOURCE.EndNodeId AND TARGET.LinkId = SOURCE.Id) 
    WHEN MATCHED THEN 
     UPDATE SET TARGET.NodeId = SOURCE.EndNodeId, 
        TARGET.LinkId = SOURCE.Id 
    WHEN NOT MATCHED BY TARGET THEN 
     INSERT (LinkId, NodeId) 
     VALUES (SOURCE.Id, SOURCE.EndNodeId) 
    WHEN NOT MATCHED BY SOURCE THEN 
     DELETE; 

我最終刪除了鏈接(不奇怪),所以基本上我想知道是否有人知道這樣做的好方法?如果可能的話我希望能夠做到這一點仍然使用MERGE語句

感謝

編輯:我發現使用不同的源合併這些數據以不同的方式,現在的問題解決了。

+0

你爲什麼要更新`TARGET.NodeId`?您似乎正在將它更新爲與您嘗試測試完全相同的內容。 – 2011-01-24 17:00:47

回答

17

也許我失去了一些東西,但

錯誤消息抱怨你不能有多個WHEN MATCHED,所以你可以轉換

WHEN MATCHED AND TARGET.NodeId = Source.StartNodeId THEN 
    UPDATE SET TARGET.NodeId = SOURCE.StartNodeId, 
       TARGET.LinkId = SOURCE.Id 
WHEN MATCHED AND TARGET.NodeId = Source.EndNodeId THEN 
    UPDATE SET TARGET.NodeId = SOURCE.EndNodeId, 
       TARGET.LinkId = SOURCE.Id 

WHEN MATCHED AND TARGET.NodeId IN (Source.StartNodeId,Source.EndNodeId) THEN 
    UPDATE SET TARGET.NodeId = CASE 
           WHEN TARGET.NodeId = Source.StartNodeId 
           THEN SOURCE.StartNodeId 
           ELSE Source.EndNodeId 
           END, 
       TARGET.LinkId = SOURCE.Id 

但作爲第一支CASE被擊中時,TARGET.NodeId = Source.StartNodeId也設置TARGET.NodeId = Source.StartNodeId和類似的第二個分支,然後似乎簡化噸o

WHEN MATCHED AND TARGET.NodeId IN (Source.StartNodeId,Source.EndNodeId) THEN 
    UPDATE SET TARGET.LinkId = SOURCE.Id