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