TSQL 合并:<WHEN NOT MATCHED> 不跳过重复项
Posted
技术标签:
【中文标题】TSQL 合并:<WHEN NOT MATCHED> 不跳过重复项【英文标题】:TSQL merge: <WHEN NOT MATCHED> doesn't skip duplicate 【发布时间】:2016-06-26 01:28:25 【问题描述】:我使用以下代码将记录从一个表更新或插入到另一个表,但重复记录时插入语句不会跳过。我怎样才能绕过它?
我收到以下错误。我想跳过重复记录并插入新的
消息 2627,级别 14,状态 1,第 6 行违反主键 约束“PK_MIBOMD_KEY_0”。无法在对象中插入重复键 'dbo.MIBOMD'。重复键值为 ( , 0, 1)。该声明有 被终止了。
MERGE [MIBOMD] AS TARGET
USING [whl] AS SOURCE
ON (TARGET.[bomItem] = SOURCE.ItemID AND TARGET.bomEntry = SOURCE.bomEntry AND TARGET.bomRev = SOURCE.rev)
WHEN MATCHED AND TARGET.bomEntry = SOURCE.bomEntry
AND TARGET.partId <> SOURCE.partid THEN
UPDATE SET TARGET.partId = SOURCE.partid
WHEN NOT MATCHED BY TARGET THEN
INSERT (partId,bomEntry, srcLoc, qty, lead)
VALUES (SOURCE.partid, SOURCE.bomEntry, 'R14SDS', SOURCE.qty, SOURCE.lead);
【问题讨论】:
您确定您的来源 ([whl]
) 没有重复项吗?
@tarheel 否,因为[whl]
上的主键是ItemID
和PartID
。只有多个或重复的Item ID
s,但ItemID + Part ID
是唯一的
@tarheel 否,因为 [whl] 上的主键是 ItemID 和 PartID。只有多个或重复的项目 ID,但项目 ID + 零件 ID 是唯一的
您能在您的问题中添加一些示例数据吗?从您的代码或您的描述中不清楚问题出在哪里......
@M.Ali 我在问题的底部添加了两张图片。
【参考方案1】:
正如您所说,来源的唯一性由ItemID + PartID
保证。
同时,您正在按来源匹配(ItemID,bomEntry,rev)=target.(bomItem,bomEntry,bomRev)
。
您完全有可能在源代码中有相同的(ItemID,bomEntry,rev)
集合,但有两个不同的PartID
。
另外,在您指定的INSERTed
列中,没有bomRev,bomItem
。
这些列是否有默认约束?他们会保证唯一性吗?
【讨论】:
以上是关于TSQL 合并:<WHEN NOT MATCHED> 不跳过重复项的主要内容,如果未能解决你的问题,请参考以下文章