not exists 和 not in 查询结果不一致的原因
来源:互联网 发布:电脑麦克风调音软件 编辑:程序博客网 时间:2024/05/15 23:46
SQL>create table test1(a number);
SQL>create table test2(b varchar2(20));
SQL>insert into test1 select object_id from user_objects;
SQL>insert into test2 select object_id from user_objects;
SQL>update test2 set b = null where b >70000;
SQL>select count(1) from test1 t1 where not exists
(select 1 from test2 t2 where t1.a=t2.b);
COUNT(1)
----------
110
SQL>select count(1) from test1 where a not in
(select b from test2);
COUNT(1)
----------
0
看似相同的语义实质查询的结果不一致,原因是单列的NULL,如果非相关子查询的结果有NULL,那么整个条件为,FALSE/UNKNOWN,也就是没有结果的原因,如果深入分析下,等价于SELECT .... WHERE ID <> NULL AND ID <>....根据NULL的比较和逻辑运算规则,可以知道整个条件要么是false,要么是unknown,所以没有结果。
多说一句,IN子查询相当于OR条件,根据NULL的逻辑运算规则,哪个条件为TRUE的行就返回那个行。
通过10053事件跟踪得出以上的语句转换
not exists:
SELECT COUNT(*) "COUNT(1)"
FROM "TEST"."TEST2" "T2", "TEST"."TEST1" "T1"
WHERE "T1"."A" = TO_NUMBER("T2"."B");
not in:
SELECT COUNT(*) "COUNT(1)"
FROM "TEST"."TEST1" "SYS_ALIAS_1"
WHERE NOT EXISTS
(SELECT /*+ */ 0 FROM "TEST"."TEST2" "TEST2"
WHERE LNNVL(TO_NUMBER("TEST2"."B") <> "SYS_ALIAS_1"."A"));
注:lnnvl用于某个语句的where子句中的条件,如果条件为true就返回false;如果条件为UNKNOWN或者false就返回true。该函数不能用于复合条件如AND, OR, or BETWEEN中。
根据10053事件可以推导出,如果一定要用not in,可以改写为
SQL> select count(1) from test1
where a not in (select b from test2 where test1.a=test2.b);
COUNT(1)
----------
110
- not exists 和 not in 查询结果不一致的原因
- mysql的not in 导致查询无结果原因
- not in和not exists的区别
- not in 和not exists的使用
- IN,NOT IN,EXISTS,NOT EXISTS的用法和差别
- exists,in 和 not in ,not exists
- exists ,not exists改写成in 和 not in 时,要注意null值的情况,会影响结果
- not exists 和not in
- not in 和 not exists
- not in和not exists查询显示Empty set
- IN、EXISTS和LEFT JOIN,NOT IN、NOT EXISTS和INNER JOIN在存在与不存在的查询效率
- IN、EXISTS和LEFT JOIN,NOT IN、NOT EXISTS和INNER JOIN在存在与不存在的查询效率
- IN、EXISTS和LEFT JOIN,NOT IN、NOT EXISTS和INNER JOIN在存在与不存在的查询效率
- IN&EXISTS 与 NOT IN&NOT EXISTS 子查询 区别
- oracle中的exists 和not exists、in的 用法详解
- 对于not in 和 not exists的性能区别:
- "<>"、"!="、"not in"、"exsits"和"not exists"的使用规范
- oracle-not in 和not exists的区别
- ScrollView嵌套GridView的解决办法
- for2thread.py 把for循环转化成多线程的样例 自己写的欢迎拍砖
- Failed to connect to socket /var/run/dbus/system_bus_socket: No such file or directory
- libvirt tsl证书过期解决办法
- 漫漫长路,心之旅程
- not exists 和 not in 查询结果不一致的原因
- Codeforces Round #153 (Div. 1)
- 清除高清视频格式MTV中的字幕
- VS2010配置OpenGL时gl文件夹的存放位置
- 改变AWS EMR中的Ganglia配置:每1秒监视一次
- windows查看进程内存使用记录
- hdu 1495 非常可乐(简单的的bfs)
- Attribute "column" must be declared for element type "property"解决办法
- CF 6 A - Triangle