我有两张桌子
表格1
Column1
_______
1
2
3
4
5
6
Run Code Online (Sandbox Code Playgroud)
表2
Column 1
________
4
NULL //This NULL value added after answering the question, to show the real problem
5
6
7
8
9
Run Code Online (Sandbox Code Playgroud)
这是一个示例案例.我试过的时候
SELECT column1 FROM Table1 WHERE column1 IN (SELECT column1 FROM Table2)
Run Code Online (Sandbox Code Playgroud)
我得到了4,5,6
什么时候
SELECT column1 FROM Table1 WHERE column1 NOT IN (SELECT column1 FROM Table2)
Run Code Online (Sandbox Code Playgroud)
我没有得到1,2,3但是没有.
在实际情况中,table1的column1是nvarchar(max),table2的column1是varchar(50).但是,我尝试将两者都投射到varchar(50)中.
请查看文档IN,具体如下:
子查询或表达式返回的任何空值,使用IN或NOT IN 与test_expression进行比较,返回UNKNOWN.将空值与IN或NOT IN一起使用可能会产生意外结果.
你还没有展示它们,但我确信NULL你的数据中至少有一个潜伏值.
您可以排除NULL(s)然后NOT IN将按预期工作:
SELECT column1 FROM Table1
WHERE column1 NOT IN (SELECT t2.column1 FROM Table2 t2
WHERE t2.column1 IS NOT NULL)
Run Code Online (Sandbox Code Playgroud)
IN并且NOT IN,在一波手中,是对立的,但你必须记住SQL的三值逻辑.想象一下,我们IN用表达形式写了
a IN (1,2,NULL)
Run Code Online (Sandbox Code Playgroud)
其处理方式与:
a = 1 OR a = 2 or a = NULL
Run Code Online (Sandbox Code Playgroud)
对于a = 1的任何行,我们有:
TRUE OR TRUE OR UNKNOWN
Run Code Online (Sandbox Code Playgroud)
是的TRUE.对于a = 3的任何行,比方说,我们有:
FALSE OR FALSE OR UNKNOWN
Run Code Online (Sandbox Code Playgroud)
是的 UNKNOWN
现在,NOT IN以同样的方式考虑:
a NOT IN (1,2,NULL)
Run Code Online (Sandbox Code Playgroud)
其处理方式与:
a != 1 AND a != 2 AND a != NULL
Run Code Online (Sandbox Code Playgroud)
对于a = 1的任何行,我们有:
FALSE AND TRUE AND UNKNOWN
Run Code Online (Sandbox Code Playgroud)
这是FALSE.对于a = 3,我们有:
TRUE AND TRUE AND UNKNOWN
Run Code Online (Sandbox Code Playgroud)
这是UNKNOWN.存在NULL意味着没有办法让这条链AND产生TRUE价值.
如果你null的Table2中有值,那么可能会发生这种情况.请改用此查询:
select *
from Table1 as t1
where not exists (select * from Table2 as t2 where t2.column1 = t1.column1);
Run Code Online (Sandbox Code Playgroud)
测试查询:
-- Table2 doesn't have null values, works good
SELECT column1 FROM Table1 WHERE column1 IN (SELECT column1 FROM Table2);
SELECT column1 FROM Table1 WHERE column1 NOT IN (SELECT column1 FROM Table2);
insert into Table2
select null;
-- nothing returned by query, because of null values in Table2
SELECT column1 FROM Table1 WHERE column1 NOT IN (SELECT column1 FROM Table2);
-- works good
select *
from Table1 as t1
where not exists (select * from Table2 as t2 where t2.column1 = t1.column1);
Run Code Online (Sandbox Code Playgroud)
这是因为SQL的三值逻辑,请参阅Damien_The_Unbeliever 很好的解释.您可以使用not null查询,如下所示:
SELECT column1 FROM Table1 WHERE column1 NOT IN (SELECT column1 FROM Table2 where column1 is not null);
Run Code Online (Sandbox Code Playgroud)
但我exists更喜欢,因为它会隐式地过滤掉null(仅仅因为使用=)条件.
另外,不要在没有别名的问题中使用类似查询的查询(实际上不是别名,而是点符号,如Table.column或Alias.column),因为您可能有不正确的结果.始终对列使用点表示法.所以你的查询应该是这样的:
SELECT t1.column1 FROM Table1 as t1 WHERE t1.column1 NOT IN (SELECT t2.column1 FROM Table2 as t2 where t2.column1 is not null);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
435 次 |
| 最近记录: |