2011-01-24 8 views
8

基本的にはSQL Server 2008 R2データベースがあります。データベースにはノードとリンクと呼ばれるテーブルがあります。リンクにはノード内のIdに関連するStartNodeIdとEndNodeIdが含まれています。このデータベースはまた、ノードとリンクとの間にリンクテーブルを必要とし、このリンクに関連するこのノードまたはこのリンクに関連するノードをより迅速にチェックする。リンクテーブルには、IDキー、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'節に複数回現れません。 "

開始ノードと終了ノードをseperatly

--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」を更新しているのですか?テストしようとしているのとまったく同じものにアップデートしているようです。 –

答えて

17

たぶん私は、エラーメッセージがあなたがそうあなたが

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 

しかし、最初の枝などに

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を持つことはできません文句を言い

しかし、何かが欠けています TARGET.NodeId = Source.StartNodeIdのときに CASEがヒットし、 TARGET.NodeId = Source.StartNodeIdと同様に2番目のブランチに設定すると、それはtを簡略化するようですo

WHEN MATCHED AND TARGET.NodeId IN (Source.StartNodeId,Source.EndNodeId) THEN 
    UPDATE SET TARGET.LinkId = SOURCE.Id  
関連する問題