Sql server SQL Server-SQL连接和插入不存在的位置(或不在中)

Sql server SQL Server-SQL连接和插入不存在的位置(或不在中),sql-server,insert-into,not-exists,notin,Sql Server,Insert Into,Not Exists,Notin,我正在尝试将两个表中的记录插入另一个表中,而我要插入的表中不存在AppID 我试过下面两种插入语句;但是,我不断收到错误消息: Msg 2627,第14级,状态1,第1行 违反主键约束“PK_tblHQTRR_BusiRisk_AppID”。无法在对象“dbo.tblHQTRR_BusiRisk”中插入重复键。重复的键值是APPID-49348。 声明已终止 我的insert语句有什么错 插入我尝试过的语句: INSERT INTO tblHQTRR_BusiRisk(AppID,AppName

我正在尝试将两个表中的记录插入另一个表中,而我要插入的表中不存在AppID

我试过下面两种插入语句;但是,我不断收到错误消息:

Msg 2627,第14级,状态1,第1行 违反主键约束“PK_tblHQTRR_BusiRisk_AppID”。无法在对象“dbo.tblHQTRR_BusiRisk”中插入重复键。重复的键值是APPID-49348。 声明已终止

我的insert语句有什么错

插入我尝试过的语句:

INSERT INTO tblHQTRR_BusiRisk(AppID,AppName,Tier,QTRR,BusiRisk)
SELECT A.AppID, A.AppName, A.TierLevel, A.QTRR, R.BusiRisk
FROM tblApplication A INNER JOIN tblProject P ON A.AppID=P.AppID1 INNER JOIN tblRisk R ON P.ProjID=R.ProjID
WHERE A.AppID NOT IN (SELECT H.AppID FROM tblHQTRR_BusiRisk H) And P.AppID1 NOT IN (SELECT H.AppID FROM tblHQTRR_BusiRisk H) 
And A.AppName IS NOT NULL And R.BusiRisk IS NOT NULL;


INSERT INTO tblHQTRR_BusiRisk(AppID,AppName,Tier,QTRR,BusiRisk)
SELECT A.AppID, A.AppName, A.TierLevel, A.QTRR, R.BusiRisk
FROM tblApplication A INNER JOIN tblProject P ON A.AppID=P.AppID1 INNER JOIN tblRisk R ON P.ProjID=R.ProjID LEFT JOIN tblHQTRR_BusiRisk H ON H.AppID=A.AppID And H.AppName=A.AppName And H.Tier=A.TierLevel And H.QTRR=A.QTRR And H.BusiRisk=R.BusiRisk
WHERE H.AppID IS NULL;

我发现我的语句不起作用的原因是因为每个AppID都有多个BusiRisk值。因此,我在下面创建了以下语句,它成功了!:

WITH ProjWithMaxDate AS(
    SELECT P.AppID1, MAX(P.ProjID) AS MaxProjID
    FROM tblProject P
    GROUP BY P.AppID1)
INSERT INTO tblHQTRR_BusiRisk (AppID,AppName,Tier,QTRR,BusiRisk)
SELECT P.AppID1
    ,A.AppName
    ,A.TierLevel
    ,A.QTRR
    ,R.BusiRisk
FROM tblApplication A
INNER JOIN tblProject P ON A.AppID = P.AppID1 INNER JOIN tblRisk R ON P.ProjID = R.ProjID INNER JOIN tblTimeline T ON P.ProjID=T.ProjID INNER JOIN ProjWithMaxDate ON P.AppID1=ProjWithMaxDate.AppID1 And P.ProjID=ProjWithMaxDate.MaxProjID 
WHERE NOT EXISTS (SELECT H.AppID 
                            FROM tblHQTRR_BusiRisk H 
                            WHERE H.AppID = A.AppID
                            AND H.AppName = A.AppName
                            AND H.AppID = P.AppID1) 
AND A.AppName IS NOT NULL AND R.BusiRisk IS NOT NULL;

您正在尝试插入一条AppID已在表中的记录。AppID是唯一的,因此它只能在表中出现一次。错误是告诉您两次尝试输入哪个ID-APPID-49348。这可能表示查询中存在问题。您只想打破在表中制定的规则:奇怪的是,错误消息中引用的APPID-49348实际上不在tblHQTRR_中。我尝试了下面提到的不存在的Wyatt Shipman方法,但它仍然给我相同的错误消息。干得好@HeatherD。请把你的答案标为正确答案。