2010-02-02 90 views
3

我预期SQL NOT IN子句

Q1: 
SELECT id, name 
FROM vw_x 
WHERE id NOT IN (select pid from table_x) 
GROUP BY id, name 
Having max(c_date) > GETDATE() 

Q2: 
SELECT id, name 
FROM vw_x 
GROUP BY id, name 
Having max(c_date) > GETDATE() 

Q1不返回任何东西,即使我知道这些ID不是TABLE_X这是行不通的查询 Q2正常运行,而无需NOT IN

我的查询有什么问题?

回答

19

你在表

NULL值试试这个

SELECT id, name 
FROM vw_x 
WHERE id NOT IN (select pid from table_x where pid is not null) 
GROUP BY id, name 
Having max(c_date) > GETDATE() 

或本

SELECT id, name 
FROM vw_x 
WHERE NOT EXISTS (select 1 from table_x where pid = vw_x.id ) 
GROUP BY id, name 
Having max(c_date) > GETDATE() 

参见Select all rows from one table that don't exist in another table

+0

对不对,我正要发布答案,谢谢:) – 2010-02-02 21:24:08

+0

感谢您的新链接,它非常好用 – 2010-02-02 21:26:06

2

有关使用左连接是什么?

SELECT id, name 
FROM vw_x 
LEFT JOIN table_x on id = pid 
WHERE pid IS NULL 
GROUP BY id, name 
Having max(c_date) > GETDATE() 
0

还有另外一种情况:子查询可能什么都不会返回。 如果NOT IN子句返回空列表,SQL Server不能正常工作。我有如下查询:

select * from table where id not in (select id from tableB where somecondition(x)) 

当子查询包含一个id列表时,查询将按预期方式返回数据。但是,当子查询不返回任何内容时,查询仍会返回数据,但随后会卡住。

我改变了查询以下,并解决了这个问题:

select * from table where id not in (select id from tableB where somecondition(x) **union all select 0**) 

这可以确保子查询至少包含一个数字。