在不存在的地方插入-获取重复的密钥错误

时间:2018-08-03 19:35:00

标签: sql-server sql-insert not-exists

执行以下命令时,我不断收到重复的密钥错误。我无法弄清楚我在做什么错以产生此错误。有人可以看看我所缺少的吗?谢谢!

INSERT INTO tblApp_Risk (AppID, BusiRisk, TechRisk, InterimRiskMitigate, RiskMitigateDesc, KeyDriverDesc, ITSvcsKeyDriver,
RMStartOrderReason, ESMVendorRisk, KeyManRisk, MultVersBehind, ProdStabRisk, RegCompRisk, TierArchGap)
    SELECT DISTINCT 
        P.AppID1, R.BusiRisk, R.TechRisk, R.InterimRiskMitigate, 
        R.RiskMitigateDesc, R.KeyDriverDesc, R.ITSvcsKeyDriver,
        R.RMStartOrderReason, R.ESMVendorRisk, R.KeyManRisk, R.MultVersBehind, 
        R.ProdStabRisk, R.RegCompRisk, R.TierArchGap
    FROM 
        tblProject P 
    INNER JOIN 
        tblRisk R ON P.ProjID = R.ProjID  
    WHERE 
        NOT EXISTS (SELECT *
                    FROM tblApp_Risk K 
                    WHERE K.AppID = P.AppID1) 
        AND P.AppID1 IS NOT NULL;

3 个答案:

答案 0 :(得分:1)

您选择的DISTINCT仅在所有字段都相同时过滤

SELECT DISTINCT 
        P.AppID1, R.BusiRisk, ...

如果有的话

 field1 field2 field3
 A        B      C
 A        D      E
 X        Y      Z
 X        Y      Z


select distinct field1, field2, field3

将返回三行,将过滤X行,但为您提供A的重复密钥

答案 1 :(得分:0)

很难知道您是否看不到您的数据,但是我猜想内部联接是一对多的一对,因此您试图多次插入相同的键。

答案 2 :(得分:0)

AppID列最有可能造成错误,因为我猜想您在联接上有一对多的关系。您要么需要在该列或其他一对多关系的关键列上删除唯一约束,要么就是不插入该值。通常,在执行联接插入时,您将为转储表创建一个键,该键不是联接表的键。例如键列,例如AppRiskId。