2013-02-28 64 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