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] 上的主键是ItemIDPartID。只有多个或重复的Item IDs,但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> 不跳过重复项的主要内容,如果未能解决你的问题,请参考以下文章

分页功能 与 分类查询功能合并

tsql 将列合并到一张表中

TSQL - 具有范围的合并组?

HSQLDB 合并 WHEN MATCHED AND 失败

根据 when 语句中的不同日期参数多次运行查询并合并结果,而不是多个 UNION ALL

查询多个结果是用case when 条件显示列的查询效率高,还是查询后union all合并效率高.