SQL 服务器 - SQL 在不存在(或不在)的地方加入和插入
SQL Server - SQL Join And Insert Where Not Exists (Or Not In)
我正在尝试将 2 table 中的记录插入另一个 table,其中 AppID 在我要插入的 table 中尚不存在。
我已经尝试了下面的两个插入语句;但是,我不断收到错误消息:
“消息 2627,级别 14,状态 1,第 1 行
违反 PRIMARY KEY 约束 'PK_tblHQTRR_BusiRisk_AppID'。无法在对象 'dbo.tblHQTRR_BusiRisk' 中插入重复键。重复键值为 (APPID-49348)。
声明已终止。"
我的插入语句有什么问题?
我试过的插入语句:
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;
我正在尝试将 2 table 中的记录插入另一个 table,其中 AppID 在我要插入的 table 中尚不存在。
我已经尝试了下面的两个插入语句;但是,我不断收到错误消息:
“消息 2627,级别 14,状态 1,第 1 行
违反 PRIMARY KEY 约束 'PK_tblHQTRR_BusiRisk_AppID'。无法在对象 'dbo.tblHQTRR_BusiRisk' 中插入重复键。重复键值为 (APPID-49348)。
声明已终止。"
我的插入语句有什么问题?
我试过的插入语句:
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;