基本上我有一个SQL Server 2008 R2数据库。该数据库有一个名为Node和Link的表。链接包含与节点中的Id相关的StartNodeId和EndNodeId。数据库还需要节点和链接之间的链接表,以便更快地检查说明,此节点是否与此链接相关或哪些节点与此链接相关。 Link表包含Identity密钥,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'子句中不能出现多次”
如果我尝试单独插入Start Nodes和End Nodes,例如
--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;
我最终删除了链接(并不奇怪),所以基本上我想知道是否有人知道这样做的好方法?如果可能的话,我希望能够继续使用合并声明
由于
编辑:我找到了一种使用不同来源合并此数据的不同方法,问题现在已经解决了。
答案 0 :(得分:18)
也许我错过了一些东西,但
错误消息抱怨您不能拥有多个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
,并且类似于第二个分支,那么这似乎简化为
WHEN MATCHED AND TARGET.NodeId IN (Source.StartNodeId,Source.EndNodeId) THEN
UPDATE SET TARGET.LinkId = SOURCE.Id