2013-02-28 84 views
0
SELECT * 
FROM dbo.tbl_inspectors 
WHERE user_id NOT IN 
(Select user_id FROM dbo.vw_alerts WHERE alertID=1) 

我試圖返回未讀取特定警報的檢查器列表,user_id是公共字段,該語句的邏輯似乎正常工作,但沒有結果回。儘管如果單獨運行,子查詢確實會返回結果。我哪裏錯了?選擇不在子查詢中的結果

+1

檢查您的數據,是否有任何檢查員實際上沒有閱讀特定警報? – 2013-02-28 11:16:54

+0

我是一個親戚navb拉維,但不是那麼糟糕:D – 2013-02-28 12:48:51

回答

4

如果你想使用NOT IN,那麼你應該只包括不空,因爲not in處理值null值是不同的:

SELECT * 
FROM dbo.tbl_inspectors 
WHERE user_id NOT IN (Select user_id 
         FROM dbo.vw_alerts 
         WHERE alertID=1 
         AND user_id is not null) 

NOT IN vs. NOT EXISTS vs. LEFT JOIN/IS NULL: SQL Server

+0

+1尼斯文章 – 2013-02-28 11:19:27

+0

非常感謝,簡單的解決方案,並增加我的理解,歡呼聲 – 2013-02-28 11:22:51

+0

@DuncanCook歡迎你,這篇文章是一個很好的參考,它是由一個StackOverflow成員。 :) – Taryn 2013-02-28 11:23:47

0

但子查詢的結果是那些你不不想要。因此,如果子查詢返回所有用戶,那麼您的查詢將不會返回任何結果。你確定它應該返回行 - 有沒有響應警報的用戶。

+0

是的,即使每個人都讀過警報,仍然有用戶(存檔,非活動等)沒有閱讀它,上面的答案解決了它。 – 2013-02-28 11:22:18