SQL Server — соединение SQL и вставка туда, где его нет (или нет)

Я пытаюсь вставить записи из 2 таблиц в другую таблицу, где AppID еще не существует в таблице, в которую я вставляю.

Я пробовал оба оператора вставки ниже; однако я продолжаю получать сообщение об ошибке:

«Сообщение 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;

person HeatherD    schedule 19.04.2018    source источник
comment
Вы пытаетесь вставить запись с AppID, который уже есть в таблице. AppID уникален, поэтому он может быть в таблице только один раз. Ошибка сообщает вам, какой идентификатор вы пытаетесь ввести дважды - (APPID-49348). Вероятно, это означает проблему в запросе.   -  person Daniel Gale    schedule 19.04.2018
comment
Вы просто хотите нарушить правила, которые вы установили в своей таблице :)   -  person Ilyes    schedule 19.04.2018
comment
Странно то, что APPID-49348, на который ссылается сообщение об ошибке, на самом деле не находится в tblHQTRR_BusiRisk. Я попробовал метод Not Exists, упомянутый ниже Wyatt Shipman, но он по-прежнему выдает то же сообщение об ошибке.   -  person HeatherD    schedule 19.04.2018


Ответы (1)


Я понял, что причина, по которой мои утверждения не работали, заключалась в том, что у меня было несколько значений BusiRisk для каждого AppID. Поэтому я создал следующее утверждение ниже, и оно сработало! :)

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;
person HeatherD    schedule 19.04.2018
comment
Молодец @HeatherD. Пожалуйста, отметьте свой ответ как правильный ответ. - person Mike Poole; 20.04.2018