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
关于如何做到这一点的任何想法?
答案 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是合适的。 如果列表项不确定则不可取。而是使用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