由“一條語句刪除重復行”引發的數據庫 NULL行的問題


--可以檢測到null列重復
delete
from [JCXS0201] where USER_ID in(select User_ID u from [JCXS0201] group by User_ID having COUNT(id) >1 ) and id not in (select MIN(id) from [JCXS0201] where USER_ID in( select User_ID from [JCXS0201] group by User_ID having COUNT(id) >1 ) )

 

--不可以檢測到null列重復
delete
from [JCXS0201] where USER_ID in( select User_ID u from [JCXS0201] group by User_ID having COUNT(id) >1 ) and id not in (select MIN(id) from [JCXS0201] group by User_ID having COUNT(id) >1 )

 

ps:后來反復測試  /2012 10 18

發現in(null,~)其中的Null無效,相當於in(~)

所以這里發現一個問題 :Group By 列時  如果列中含有NULL值

只能通過非null值來描述,如改行的id或者row_number() 函數得到的行號  去處理

 

上面語句錯誤分析:

將分兩塊來描述,分別是User_ID和ID

一、先看User_ID

1、Group By User_id 后COunt (id)和Count(User_id)得到的不同效果

按到里說 本身有三行User_ID為NULL , Count(NULL)貌似無效

2、接着讓UserId in(NULL,1257646)和User_ID in (1257646)這兩個語句是一致的,前面的NULL被會忽略。

實際上都是 User_ID in (1257646)的效果

在這里是不是可以理解為,sql server中 NULL不是一個值,而是一個默認的狀態

二、再來看分組后的ID

含Grou By User_ID的語句中 不知道是否可以Select ID

如果不可以的話,就不能處理NULL的情況,所以必須用到 Row_NUmber()函數,為其添加行號

這是我的理解,有錯誤請指出

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM