【问题标题】:INSERT INTO WHERE NOT EXISTS - Getting Duplicate Key Error在不存在的地方插入 - 出现重复键错误
【发布时间】:2019-01-11 17:29:22
【问题描述】:

执行以下操作时,我不断收到重复键错误。我无法弄清楚我做错了什么来产生这个错误。有人可以看看我错过了什么吗?谢谢!

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;

【问题讨论】:

  • 那么,如果您将 insert into 子句放入并运行 select,结果集是否足够小,您可以直观地扫描重复键?也许在那个领域排序?否则,您可以单独对该字段进行分组并进行计数。

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


【解决方案1】:

如果不查看您的数据就很难知道,但我猜内部联接是一对多的,因此您尝试多次插入相同的键。

【讨论】:

    【解决方案2】:

    您选择的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 的重复键

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • AppID 列是一对多的关系(多个项目具有相同的 AppID)。我将尝试为我要插入的表创建不同的键的方法。谢谢!
      猜你喜欢
      • 2012-10-18
      • 1970-01-01
      • 2020-12-16
      • 2021-10-01
      • 2013-03-15
      • 1970-01-01
      • 2012-01-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多