很久以前,在一个远在很远的数据库中,开发人员编写了一个查询,其中他/她依赖于编写谓词的顺序.
例如,
select x
from a, b
where NOT REGEXP_LIKE (a.column, '[^[:digit:]]')
and a.char_column = b.numeric_column;
(解释计划建议将to_number转换应用于a.char_column)
我认为不仅仅是设计这个“正常工作”(Oracle 11g).但是,在Oracle 12c中运行时,不遵循谓词的顺序,因此此查询会因无效数字异常而中断.我知道我可以尝试通过使用ORDERED_PREDICATES提示强制12c按顺序评估谓词
select /*+ ORDERED_PREDICATES +*/ x
from a, b
where NOT REGEXP_LIKE (a.column, '[^[:digit:]]')
and a.char_column = b.numeric_column
..或使用to_char转换其中一个值进行比较.缺点是to_char可能会运行一百万行.我认为以下内联视图可能是一个更好的解决方案.我保证首先评估内联视图吗?
select x
from b
inner join (
select only_rows_with_numeric_values as numeric_column
from a
where NOT REGEXP_LIKE (a.column, '[^[:digit:]]')
) c
on c.numeric_column = b.numeric_column;
最佳答案 关于谓词顺序 – 请看
https://jonathanlewis.wordpress.com/2015/06/02/predicate-order-2/
根据doc(https://docs.oracle.com/database/121/SQLRF/queries008.htm#SQLRF52358),你应该使用rownum将你的上一个查询重写为next
select x
from b
inner join (
select only_rows_with_numeric_values as numeric_column,
rownum
from a
where NOT REGEXP_LIKE (a.column, '[^[:digit:]]')
) c
on c.numeric_column = b.numeric_column;
禁止查询取消或仅使用提示/ * no_unnest * /