2014-09-29 83 views
0

我想排除它們作爲子查詢的一部分返回的記錄。返回位置='Q'的所有'物品'清單,手頭有正數量,過去14天內沒有交易。當我單獨運行兩個查詢時,它們都可以正常工作,但是當我像下面一樣運行它們時,雖然存在明確匹配的記錄,但沒有記錄被返回。NOT IN子查詢

SELECT l.item AS 'Item' FROM itemloc l WHERE l.loc = 'Q' AND l.qty_on_hand > 0 AND l.item NOT IN (SELECT t.item FROM transaction t WHERE t.RecordDate > DATEADD(DAY, -14, GETDATE()) GROUP BY t.item)

+1

我會使用'l.id',因爲它是獨一無二的...'在哪裏l.id不在'(提供你有一種方法在這裏得到id) – Milen 2014-09-29 15:37:48

+0

子查詢返回任何空值?這不符合,不存在適用於這些情況,或在您的子查詢中檢查t.item IS NOT NULL – Shriike 2014-09-29 15:39:13

+0

示例提琴可以幫助我們更好地理解您的問題。 – Milen 2014-09-29 15:41:55

回答

1

代替not in,使用not exists(或left join和比較NULL)。所以,試試這個:

WHERE l.loc = 'Q' AND l.qty_on_hand > 0 AND 
     NOT EXISTS (SELECT 1 
        FROM transaction t 
        WHERE t.RecordDate > DATEADD(DAY, -14, GETDATE()) and t.item = l.item 
       ) 

的問題是(可能)是t.item呈現出NULL值。在這種情況下,NOT IN返回「未知」或「錯誤」。而且,「未知」被視爲虛假。所以,當子查詢的值爲NULL時,表達式永遠不會返回「true」。

您也可以通過在子查詢中添加一個where子句來解決此問題。但是,我發現NOT IN的語義對於每個人都是不直觀的。出於這個原因,我推薦使用NOT EXISTS。您也不需要group by子查詢。這是多餘的。

0

編輯item列,使其不能爲空,這是您正確的SQL查詢中斷的地方。或使用連接代替