基本的には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文を使用して
おかげ
をそれを行うことができるようにしたいと思い編集:私は別のソースを使用してこのデータをマージする別の方法を発見した、問題が解決されました。
なぜ「TARGET.NodeId」を更新しているのですか?テストしようとしているのとまったく同じものにアップデートしているようです。 –