左右连接,oracle11版本中的bug

这的确是个bug,版本oracle版本为11.2.0.2):

当a,b两个数据集做外关联“(+),或left join或right join”时,大部分写法都没问题,特殊情况碰在一起会有问题。

 

例:1,2写法没问题,3写法有时有问题:

1.  如果两个数据集a,b都是表,外关联的结果没问题

2.  如果两个数据集a或b是子查询,但所选的信息均为表中字段,而非常量,外关联的结果也没问题。

3.  如果两个数据集a或b是子查询,但所选的信息有常量(例邮件中的情况),外关联的结果有时有问题(数据量大时Oracle的执行计划可能有异常)。

select *  from (select a.it, b.pid

          from (select poi_pid, '3' it

                  from ix_poi_flag a

                 where a.flag_code in ('110000030000')) a,

               ix_poi b

         where a.poi_pid(+) = b.pid)

where pid = 278599;

 

 

select *

  from (select a.it, b.pid

          from (select poi_pid, '3' it

                  from ix_poi_flag a

                 where a.flag_code in ('110000030000')) a

          right join ix_poi b on a.poi_pid = b.pid)

where pid = 278599;

 

解决办法,可加hint ”select /*+ no_merge*/ poi_pid, '3' it” 强制oracle先执行子inline view视图,再与其他数据集做关联即可。

 

各兄弟组可验证分析下,再查找是否存有类似语句~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值