2013-02-28 81 views
3

我正在嘗試對包含Oracle 11g下的所有人的記錄進行更新。我有一個包含ID的列,其中一些包含連字符。該表對此ID有約束,因此兩個不同的人不能具有相同的ID。我的目標是刪除連字符,同時避免更新時出現任何約束違規。所以,我想這個查詢檢測,將違反約束記錄:嘗試避免重複時丟失NULL關鍵字錯誤

SELECT count(*) FROM people 
WHERE externalid LIKE '%-%' AND 
replace(externalid, '-') IS IN (SELECT externalid FROM people); 

這種失敗,則與ORA-00908:缺少NULL關鍵字。我知道這是由於最後一行,但我不知道如何構建該部分查詢來檢測已使用的非連字ID的記錄。我如何檢測這些違反約束條件的記錄?

回答

12

IS關鍵字用在something IS NULL中,而不是IN關鍵字。這就是爲什麼數據庫認爲存在NULL缺失的原因。只是刪除IS

SELECT count(*) FROM people 
WHERE externalid LIKE '%-%' AND 
replace(externalid, '-') IN (SELECT externalid FROM people); 
+0

哦,上帝,你是對的。我完全有一個腦袋。 – Keen 2013-02-28 19:24:23

2

我不知道這是否會在甲骨文,但值得一試的工作:

SELECT * FROM people p1 
Inner Join people p2 on replace(p1.externalid, '-') = p2.externalid 
and p1.externalid < p2.externalid --prevents duplicate matches 
Where p1.externalid LIKE '%-%'