NOT IN问题

时间:2014-01-14 17:10:09

标签: sql sql-server

SELECT * 
FROM   table -> 35 records

SELECT * 
FROM   table 
WHERE  x IN (SELECT x 
             FROM   table1)  -> 34 records

SELECT * 
FROM   table 
WHERE  x NOT IN (SELECT x 
                 FROM   table1) -> 0 records

关于如何做到这一点的任何想法?

4 个答案:

答案 0 :(得分:1)

NULL值的简单修复是:

SELECT * 
FROM   table 
WHERE  x NOT IN (SELECT x 
                 FROM   table1
                 WHERE x is not null);

但是,由于not exists问题,建议使用not in而不是NULL

select t.*
from table t
where not exists (select 1 from table1 t1 where t1.x = t.x);

答案 1 :(得分:0)

您的x个值之一是NULL。在任何比较中,NULL值永远不会评估为true(因为值未知)。

答案 2 :(得分:0)

正如其他人所说,你的1个值很可能是NULL。您可以在WHERE子句中使用IS NULL对此进行测试。例如:

SELECT *
FROM MyTable
WHERE MyColumn IS NULL

这个简单的例子可以找到MyTable中MyColumn中有NULL的所有记录。

答案 3 :(得分:0)

“使用IN或NOT IN与test_expression进行比较的子查询或表达式返回的任何空值都返回UNKNOWN。将空值与IN或NOT IN一起使用会产生意外结果。 “

NOT/IN MSDN

对于注释,当您知道来自子查询的行数将始终保持小且有限的值时,NOT IN是合适的。 如果列表项不确定则不可取。而是使用LEFT JOIN类型查询。

EDIT-1 @John Gibb

    DECLARE @t TABLE
    (
        id  INT NULL
    )

    DECLARE @t1 TABLE
    (
        id  INT NULL
    )

    INSERT INTO @t (id) SELECT 1 UNION ALL SELECT NULL UNION ALL SELECT 2
    INSERT INTO @t1 (id) SELECT 1 UNION ALL SELECT NULL

    SELECT *
    FROM @t
    WHERE id NOT IN (SELECT id FROM @t1)

    SELECT *
    FROM @t t
    LEFT JOIN @t1 t1
    ON t.id=t1.id
    WHERE t1.id IS NULL
    AND t.id IS NOT NULL

enter image description here