Posted on 2019-01-11 09:40
Prayer 閱讀(199)
評論(0) 編輯 收藏 引用 所屬分類:
DB2
http://www.cnblogs.com/51net/p/4165781.html
如果下:Table_A表和Table_B表,要求查詢出在Table_A表中不在Table_B表中的記錄。

CREATE TABLE [dbo].[Table_A]( [ID] [nchar](10) NULL, [Name] [nchar](10) NULL ) ON [PRIMARY] GO ID Name 001 張三 002 李四 003 王五 CREATE TABLE [dbo].[Table_B]( [ID] [nchar](10) NULL, [Name] [nchar](10) NULL ) ON [PRIMARY] GO ID Name NULL 張三 002 李四 NULL 王五
很容大家第一時間相當的寫法是:
SELECT * FROM dbo.Table_A AS a WHERE a.ID NOT IN ( SELECT b.ID FROM dbo.Table_B AS b)
然而查詢出來并沒有達到預期的
ID Name
001 張三
003 王五
原因很簡單:由于NULL不能進行如何的“操作”
–如果null參與算術運算,則該算術表達式的值為null。(例如:+,-,*,/ 加減乘除)
–如果null參與比較運算,則結果可視為false。(例如:>=,<=,<> 大于,小于,不等于)
–如果null參與聚集運算,則聚集函數都置為null。除count(*)之外。
--如果在not in子查詢中有null值的時候,則不會返回數據。 (最簡單的解釋請參考下面的評論說明)

--正確寫法 SELECT * FROM dbo.Table_A AS a WHERE a.ID NOT IN ( SELECT b.ID FROM dbo.Table_B AS b WHERE b.ID IS NOT NULL ) --排除NULL值參與運算符比較 --建議修改為關聯查詢方法 --正確寫法1 SELECT * FROM dbo.Table_A AS a WHERE NOT EXISTS ( SELECT * FROM dbo.Table_B AS b WHERE a.ID = b.ID ) --正確寫法2 SELECT * FROM dbo.Table_A AS a LEFT OUTER JOIN dbo.Table_B AS b ON a.ID = b.ID WHERE b.ID IS NULL