Sql 不在的问题

Sql 不在的问题,sql,sql-server,Sql,Sql Server,关于如何实现这一点有什么想法吗?您的x值之一是NULLNULL值在任何比较中都不会计算为true(因为该值未知) 对NULL值的简单修复是: SELECT * FROM table -> 35 records SELECT * FROM table WHERE x IN (SELECT x FROM table1) -> 34 records SELECT * FROM table WHERE x NOT IN (SEL

关于如何实现这一点有什么想法吗?

您的
x
值之一是
NULL
NULL
值在任何比较中都不会计算为
true
(因为该值未知)

NULL
值的简单修复是:

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
但是,由于
NULL
问题,建议使用
notexists
而不是
notin

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

正如其他人所说,您的值中有1个可能为空。您可以在WHERE子句中使用IS NULL来测试该属性。例如:

select t.*
from table t
where not exists (select 1 from table1 t1 where t1.x = t.x);
这个简单的示例将在MyTable中找到MyColumn中包含NULL的所有记录。

“子查询或表达式返回的任何NULL值与使用in或NOT in返回的test_表达式进行比较时都是未知的。将NULL值与in或NOT in一起使用可能会产生意外的结果。 "

请注意,当您知道来自子查询的行数将始终保持较小且有限的值时,NOT IN是合适的。 如果列表项不确定,则不建议这样做。而是使用左连接类型查询

@John Gibb的编辑-1

SELECT *
FROM MyTable
WHERE MyColumn IS NULL

您是否检查了空值?您的记录中有一条在x中有
null
值。我不同意在非ins中使用左连接。它们在逻辑上不是等价的,如果连接值不是唯一的,左连接将为您提供额外的行。我建议不存在…我没有说LeftJoin与NotIN相同。我提到了两件事。您可以使用LEFT-JOIN的right格式实现NOTIN。如果子查询多次出现“不在项中”,则结果可能会变大,导致查询失败,并出现MSDN中提到的错误。在OP的上下文中,如果这个场景不相关,许多其他更简单的解决方案也是可能的。我仍然选择不存在的
-它更清楚地表达了您的意图,因此更具可读性,并且可能会更有效地实现为
左反半联接
而不是
左外联接
是的,这是个人根据需求的选择。请记住,如果表足够大或随着时间的推移变大,“WHERE NOT EXIST”(不存在的地方)将执行缓慢。它不能正确地利用你的索引。开发人员编写查询可能甚至没有想过这一点,也不考虑表上的索引。如果查询是用LEFT-JOIN编写的,那么随着时间的推移,如果表突然接收到大数据,并且查询执行缓慢,那么开发人员很可能不必担心这个问题。它不会“如果表足够大,则执行缓慢”,您从何而来?它可以很好地使用索引,并且在处理大型表时仍可能比left-join性能更好。
    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