这的确是个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视图,再与其他数据集做关联即可。
各兄弟组可验证分析下,再查找是否存有类似语句~