2014-07-24 54 views
0

我對着在sqlite的以下難題,並且不知道是否有什麼我失蹤約SQLite的話是行不通的。SQL:「NOT IN(SUBQUERY)」如預期

基本上,當我問一個表中總唯一值,我得到一個數字。當我詢問第二個表中存在的這些值的子集時,我會得到更小的數字。但是,當我問子集的恭維,我得到0

考慮兩個表,A和B,通過一個唯一的ID,我們可以稱之爲WIDGET_ID表示部件的不同,但重疊的人羣。

我收到以下行爲:

SELECT COUNT(DISTINCT WIDGET_ID) 
FROM A 

輸出:100

SELECT COUNT(DISTINCT WIDGET_ID) 
FROM A 
WHERE WIDGET_ID IN (SELECT WIDGET_ID FROM B) 

輸出:75

SELECT COUNT(DISTINCT WIDGET_ID) 
FROM A 
WHERE WIDGET_ID NOT IN (SELECT WIDGET_ID FROM B) 

輸出:0

不應該這是不可能?

回答

3

正常原因與not in問題是NULL值的存在。當列表中有NULL因爲NULL比較不可能是真的NOT IN總是失敗。

您可以通過過濾這些外解決這一問題:

SELECT COUNT(DISTINCT WIDGET_ID) 
FROM A 
WHERE WIDGET_ID NOT IN (SELECT WIDGET_ID FROM B WHERE WIDGET_ID IS NOT NULL); 

我更喜歡使用NOT EXISTS,因爲它具有您所期望的語義:

SELECT COUNT(DISTINCT WIDGET_ID) 
FROM A 
WHERE NOT EXISTS (SELECT WIDGET_ID FROM B WHERE B.WIDGET_ID = A.WIDGET_ID); 
+0

炸藥。這解決了它。非常感謝,我想這是有道理的。所有SQL方言都是如此嗎? – user1893148

+0

空值有[一些不兼容(http://www.sqlite.org/nulls.html),但空值在在搬運中列出的所有數據是一致的。 –

+0

@ user1893148。 。 。基本上是「是」。 NULL的處理由ANSI SQL標準定義。有一些細微差別,但在所有數據庫中,與'NULL'的比較返回NULL(相當於假),除了特殊比較,例如「IS NULL」。 –