2014-08-28 38 views
0

我有一个查询以我不会期望的方式行事。当请求不在空集的项目时返回空集

我有两个表,stagin_usersusers。在这两个表中,我有一个名为name的列。在users表中,name的EVERY值是NULL。在staging_users我有13行没有NULL值。我试图运行一个查询,在那里我得到了暂存表中名称不在users表中的所有用户。

我的书面查询:

SELECT name FROM staging_users WHERE name NOT IN (SELECT name FROM users);

由于编写查询,我没有得到任何结果回来。这种行为的原因是什么?

由于users表只具有NULL值,我知道我可以说WHERE name IS NOT NULL,我会得到相同的结果,但我想这个查询针对表中的值,而这一切正好是NULL工作。

+0

可能重复的[MySQL的选择x从WHERE NOT IN(SELECT X选自B) - 意外的结果](http://stackoverflow.com/questions/1001144/mysql-select-x-from -a-where-in-select-x-from-b-unexpected-result) – 2014-08-28 16:57:26

+1

NULL被看作是'unknown',这使得查询排序无效。 – RST 2014-08-28 17:18:46

回答

3

docs

为符合SQL标准,在返回NULL不仅如果在左侧表达式为NULL,而且如果不匹配,在列表中的一个发现列表中的表达式为NULL。

而且

expr NOT IN (value,...)相同NOT (expr IN (value,...))

因此,你是SELECT荷兰国际集团NULL值.. NOT IN返回NULL ..所以没有行匹配。

你可以纠正像这样:

SELECT name 
    FROM staging_users 
WHERE name IS NOT NULL 
    AND name NOT IN (
    SELECT name 
    FROM users 
    WHERE name IS NOT NULL 
     ); 

或者,相同的逻辑:

SELECT su.name 
    FROM staging_users su 
LEFT JOIN users u 
     ON u.name = su.name 
     AND su.name IS NOT NULL 
     AND u.name IS NOT NULL; 

作为一个额外的说明,我会认真质疑的数据结构,允许用户有NULL的名字..如果此更改,您的原始查询将起作用。