如何用NOT EXISTS实现无主键SQL表的无重复数据插入?
解决方案:无主键表插入不重复行
首先,你之前的逻辑错误在于没有针对临时表的每一行,判断目标表是否已经存在完全匹配的记录。你的两种尝试要么是全局判断(IF NOT EXISTS),要么是完全错误的WHERE条件(和临时表行无关联),导致重复插入。
要解决这个问题,核心是先明确“重复行”的定义——既然没有主键,你需要确定哪些字段组合在一起能唯一标识一行。从你之前的代码来看,Drug_Identifier + Effective_Date是你试图用来区分的字段组合,那我们就基于这个组合来过滤:
正确的插入语句
INSERT INTO FPS_SA.FPS.Predictive_Acquisition_Cost_NEW ( Drug_Identifier, Identifier_Type, Drug_Group, Brand_Generic, PAC, PAC_Low, PAC_High, PAC_Retail, Error_Code, Effective_Date, End_Date, PAC_Model_Version ) SELECT lz.Drug_Identifier, lz.Identifier_Type, lz.Drug_Group, lz.Brand_Generic, lz.PAC, lz.PAC_Low, lz.PAC_High, lz.PAC_Retail, lz.Error_Code, lz.Effective_Date, lz.End_Date, lz.PAC_Model_Version FROM FPS_LZ.fps.Predictive_Acquisition_Cost lz WHERE NOT EXISTS ( -- 子查询判断目标表是否已存在相同Drug_Identifier和Effective_Date的记录 SELECT 1 FROM FPS_SA.FPS.Predictive_Acquisition_Cost_NEW sa WHERE sa.Drug_Identifier = lz.Drug_Identifier AND sa.Effective_Date = lz.Effective_Date )
为什么之前的方法失效?
- 开头的IF NOT EXISTS:这是一个全局判断,只要存在任何一对
Drug_Identifier相同但Effective_Date不同的行,就会执行整个插入操作,不会过滤掉临时表中已经在目标表存在的行。 - 结尾的WHERE NOT EXISTS(SELECT * FROM ...):这个条件只判断目标表是否为空,只要目标表有数据,就不会插入任何行;如果目标表为空,就全量插入,完全没做到逐行判断重复。
额外建议
如果业务上Drug_Identifier + Effective_Date确实是唯一标识,建议给目标表添加唯一约束:
ALTER TABLE FPS_SA.FPS.Predictive_Acquisition_Cost_NEW ADD CONSTRAINT UQ_PAC_Drug_EffectiveDate UNIQUE (Drug_Identifier, Effective_Date);
这样即使插入语句有问题,数据库也会直接阻止重复插入,避免数据混乱。
内容的提问来源于stack exchange,提问作者Danica Mattson
相关产品推荐
相关产品推荐

