【发布时间】:2016-12-28 12:19:46
【问题描述】:
我有一个代码,我仍然想知道为什么它不应该工作,我想合并这两个表并查看下面的代码和生成错误的表。请这些表刚刚被提取,并且比下面粘贴的行多。只是样品
MERGE INTO [server1].[DATABASE].[dbo].[MD_ToolsMaintDate] WITH (HOLDLOCK) AS TARGET
USING (SELECT * from [server2].[DATABASE].[dbo].[MD_ToolsMaintDate]) AS SOURCE
ON TARGET.MaintDate = SOURCE.MaintDate
AND Target.MDToolID = Source.MDToolID
AND Target.SerialID = Source.SerialID
WHEN MATCHED AND
(
OR Target.ComponentID <> Source.ComponentID
OR Target.Notes <> Source.Notes
)
THEN
UPDATE SET
, TARGET.ComponentID = SOURCE.ComponentID
, TARGET.Notes = SOURCE.Notes
WHEN NOT MATCHED THEN
INSERT ( SerialID,MDToolID,MaintDate,ComponentID,Notes)
VALUES ( SOURCE.SerialID, SOURCE.MDToolID, SOURCE.MaintDate,SOURCE.ComponentID, SOURCE.Notes);
SELECT * FROM [server1].[DATABASE].[dbo].[MD_ToolsMaintDate]
错误:MERGE 语句多次尝试更新或删除同一行。当目标行匹配多个源行时会发生这种情况。 MERGE 语句不能多次 UPDATE/DELETE 目标表的同一行。优化 ON 子句以确保目标行最多匹配一个源行,或使用 GROUP BY 子句对源行进行分组。
-----server 1 table :
MaintenanceID SerialID MDToolID MaintDate ComponentID Notes
218 8 4 2016-05-26 01:00:00.0000000 NULL pivot
219 9 4 2016-08-06 21:15:00.0000000 NULL
220 130 4 2016-08-09 00:00:00.0000000 NULL NULL
-----server 2 table :
MaintenanceID SerialID MDToolID MaintDate ComponentID Notes
45 130 4 2016-02-09 00:00:00.0000000 NULL CHECK ME
49 131 5 2016-02-09 00:00:00.0000000 NULL CHECK ME
我们将不胜感激任何更正和方法。两个表上的维护 ID 永远不会保持相同,因为这两个表甚至位于不同的位置
【问题讨论】:
标签: sql sql-server tsql merge