SQL分析--欺骗你的子查询
来源:互联网 发布:android listview优化 编辑:程序博客网 时间:2024/05/29 02:12
欺骗你的子查询
初始化场景先:
create table test_01( rn number);create table test_02( rn number);insert into test_01 values(1);insert into test_01 values(2);insert into test_01 values(3);insert into test_01 values(4);insert into test_02 values(1);insert into test_02 values(2);insert into test_02 values(3);commit;测试的SQL
select a.rn from test_01 a where a.rn in (select a.rn from test_02);测试的结果:
SQL> select a.rn from test_01 a where a.rn in (select a.rn from test_02); RN---------- 1 2 3 4解析计划:
SELECT STATEMENT, GOAL = ALL_ROWS5452 FILTER TABLE ACCESS FULLTAHTSTEST_01 3452 FILTER TABLE ACCESS FULLTAHTSTEST_02 23产生的疑问:
子查询中 select a.rn from test_02 为啥不报错。
继续测试:
select a.rn from test_01 a where a.rn in (select a.rn from dual);select a.rn from test_01 a where a.rn in (select rn from test_02 where rn=a.rn) select a.rn from test_01 a where a.rn in (1,2,3);执行上面3个SQL,SQL1居然是和疑问SQL的结果是一致的。后2个SQL结果为(1,2,3)
SQL2的解析计划:
SELECT STATEMENT, GOAL = ALL_ROWS5452 FILTER TABLE ACCESS FULLTAHTSTEST_01 3452 FILTER FAST DUAL 21也就是说和“子查询”中的表没有任何关系。
感谢“【话唠】深圳-Luke”的解释:
可以这样解析你的语句:
select a.rn from test_01 a 是外层循环,值分别是{1,2,3,4}
当值为1时,替换where子句为: where 1 in (select 1 from test_02);
当值为2时,替换where子句为: where 2 in (select 2 from test_02);
...
select a.rn from test_01 a 是外层循环,值分别是{1,2,3,4}
当值为1时,替换where子句为: where 1 in (select 1 from test_02);
当值为2时,替换where子句为: where 2 in (select 2 from test_02);
...
扩展:
但反过来就不行了,比如select a.rn from test_01 a where b.rn in (select rn from test_02 b);
可以理解为超出作用域
根据解析计划:
首先是变量table2,然后对table2的数据进行过滤。
所以扩展理解为:
当table2表有数据的时候:
select a.rn from test_01 a where a.rn in (a.rn);结果永远是test_01表的数据。
当table2表没有有数据的时候:
select a.rn from test_01 a where a.rn in (null);结果永远是空。
0 0
- SQL分析--欺骗你的子查询
- SQL 子查询分析
- SQL的子查询
- SQL的子查询
- Microsoft SQL Server 数据库的子查询运算分析
- SQL子查询的运算
- sql的子连接查询
- 如何欺骗你的用户
- 你的眼睛会不会欺骗你?
- SQL子查询的一些例子
- MS-SQL的子查询表达式(1)
- SQL循序渐进(21)更多的子查询
- 一道关联子查询的sql题
- SQL子查询的一些例子
- 一个关于sql子查询的问题
- sql 子查询的一些例子
- 记一条子查询的SQL优化
- Entity SQL的子表查询
- 熬过六月,蜕变七月
- 伯努利分布详解(包含该分布数字特征的详细推导步骤)
- VC++ 创建msi文件
- POJ 2723 Get Luffy Out(2-SAT)
- c++ .inl 文件说明
- SQL分析--欺骗你的子查询
- 如何将图片保存至自定义分组
- Linux安装vsFTPd服务器详细教程
- Reachability 网络状态的使用和封装
- linux网络编程基础API(二)
- js获取表单的值
- Activity与Service绑定(activity调用service方法)--安卓软件开发
- 一步一步android(16):关于socket编程(2)【以非阻塞I/O服务器及Service为例】
- grub命令用法