2014-09-26 17 views
0

如果數據當前不存在,我試圖將表A中的數據添加到表B中。當我將它作爲select語句運行時,一切都看起來正確。當我添加插入語句時,出現錯誤「無法在對象'dbo.inonhd'中插入具有唯一索引'PARTLOCA'的重複鍵行」。我寫的代碼應該防止重複。有人能指出我做錯了什麼嗎?當從SQL Server中的表B中缺少數據時將表A中的數據添加到表B中時,獲取重複鍵錯誤

insert into inonhd 
(fpartno 
,fpartrev 
,fbinno 
,flocation 
,fonhand 
,fac 
,fcudrev) 

SELECT INMAST.fpartno 
,INMAST.frev 
,inmast.fbin1 
,inmast.flocate1 
,inmast.fonhand 
,inmast.fac 
,inmast.frev 
FROM INMAST 
LEFT JOIN INONHD 
ON INMAST.FPARTNO + INMAST.FREV = INONHD.FPARTNO + INONHD.FPARTREV 
where INMAST.fpartno like 'gs-%' 
and inmast.fonhand = '0' 
and inonhd.fpartno is null 
+0

看起來像INMAST中的一列必須與兩列INONHD或相反。所有列上唯一索引PARTLOCA被定義的列。我們可以幫助您找到造成這種情況的行。 – user3851404 2014-09-26 16:03:08

回答

0

你正在做的兩列的連接,因此可能需要檢查NULL條件對這兩列 匹配是唯一索引複合鍵 - FPARTNO和FREV?

and inonhd.fpartno is null and inonhd.FREV is null 

而且最好是用MERGE

MERGE INONHD as target 
USING (SELECT INMAST.fpartno 
,INMAST.frev 
,inmast.fbin1 
,inmast.flocate1 
,inmast.fonhand 
,inmast.fac 
,inmast.frev 
FROM INMAST) as source (frev, fbin1, flocate1, fonhand, fac, frev) 
ON fonhand = '0' 
    and fpartno is null 
    and INMAST.FPARTNO + INMAST.FREV = INONHD.FPARTNO + INONHD.FPARTREV 
WHEN NOT MATCHED THEN 
    INSERT (fpartno 
,fpartrev 
,fbinno 
,flocation 
,fonhand 
,fac 
,fcudrev) 
VALUES (source.fpartno 
,source.fpartrev 
,source.fbinno 
,source.flocation 
,source.fonhand 
,source.fac 
,source.fcudrev) 
1

假設PARTNO和位置是唯一索引的一部分,使用下面的SQL做的,找到行造成錯誤:

select fpartno,flocation, ct 
from 
(SELECT INMAST.fpartno as fpartno , inmast.flocate1 as flocation 
, count(0) ct 
FROM INMAST 
LEFT JOIN INONHD 
ON INMAST.FPARTNO + INMAST.FREV = INONHD.FPARTNO + INONHD.FPARTREV 
where INMAST.fpartno like 'gs-%' 
and inmast.fonhand = '0' 
and inonhd.fpartno is null 
group by INMAST.fpartno, inmast.flocate1 ) t 
where t.ct > 1 
+0

如果您確定,請使用MERGE的第一個答案,SELECT下面的INSERT中的所有行都是唯一的。否則,使用上面的SELECT來查找數據問題。 – user3851404 2014-09-26 16:16:05

+0

非常感謝你有2重複,不應該在那裏。我將在不應有重複的其他表上使用此代碼。 – Turtleman10 2014-09-26 16:45:12

0

同意Rajesh, 如果您使用合併,您也不需要「和fpartno爲空」過濾器 並且我們可以應用源文件中的其他過濾器sql

MERGE INONHD as target 
USING (SELECT INMAST.fpartno 
,INMAST.frev 
,inmast.fbin1 
,inmast.flocate1 
,inmast.fonhand 
,inmast.fac 
,inmast.frev 
FROM INMAST 
WHERE INMAST.fpartno like 'gs-%' 
and inmast.fonhand = '0') as source (frev, fbin1, flocate1, fonhand, fac, frev) 
ON INMAST.FPARTNO + INMAST.FREV = INONHD.FPARTNO + INONHD.FPARTREV 
WHEN NOT MATCHED AND THEN 
    INSERT (fpartno 
,fpartrev 
,fbinno 
,flocation 
,fonhand 
,fac 
,fcudrev) 
VALUES (source.fpartno 
,source.fpartrev 
,source.fbinno 
,source.flocation 
,source.fonhand 
,source.fac 
,source.fcudrev) 
相關問題