发现个sql解析的感觉像BUG的特性,分享出来

liu志坚 2020-04-07 04:41:38
版本。
SQL> select * from v$version where rownum<2;

BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production


create table t_lzj1(aa number,bb varchar2(100),cc number,dd varchar2(100));
create table t_lzj2(aa number,bb varchar2(100));

select aa from lzj.t_lzj2 b where cc > 5; #这个报ora-00904


select * from lzj.t_lzj1 a where aa in (select aa from lzj.t_lzj2 b where cc > 5);
这样可以执行。


10053跟踪发现优化器优化后把CC解析为 a表的了:
SELECT A.AA AA, A.BB BB, A.CC CC, A.DD DD
FROM LZJ.T_LZJ2 B, LZJ.T_LZJ1 A
WHERE A.CC > 5
AND A. AA = B.AA;


...全文
71 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
liu志坚 2020-04-07
  • 打赏
  • 举报
回复
应该是不算bug,不过业务理解上这样写感觉有点迷。之前一直理解的 in 里面的子查询可以单独查询出结果的。 我自己写的sql从来不会这样写,今天看到开发的一个sql写这样了,跟踪了才发现是这个情况^_^
nayi_224 2020-04-07
  • 打赏
  • 举报
回复
就是不加表别名时列解析的规则。刚学的时候还研究过一阵,现在全忘了。只记得有些时候执行结果确实挺迷的,但是规则没问题。
卖水果的net 2020-04-07
  • 打赏
  • 举报
回复
这个不应该算是 bug。 oracle 如果用到子查询,会现子查询内推进一层(只有一层),看下面的例子 -- 如果写成这个样子,也会报列不存在的 (也就 ORA-00904 ),你打个 10053 看看,我没测试过 select * from t_lzj1 a where aa in (select * from (select aa from t_lzj2 b where cc > 5));

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧