テーブルのような大きなエンティティ属性値があります。サブクエリを使用してこのテーブルからいくつかの行を選択し、行でフィルタリングしようとしました。この状況でサブクエリとメインクエリをマージしないようにするにはどうすればよいですか?
例えば:
EMP:
EMPNO | ENAME | SAL
---------------------
1000 | KING | 10000
1001 | BLAKE | 7500
CREATE VIEW EAV(ID,ATTR,VALUE) AS
select empno, 'name'||ename, ename from emp -- subquery 1
union
select empno, 'sal'||ename, ename from emp -- subquery 2
union
select empno, 'mgr'||ename, ename from emp -- subquery 3
注:||ename
サブクエリ 1 と 3 にフィルタ "(null is not null)" を追加して、Oracle が次のクエリを最適化するのを防ぐために追加されました。
サブクエリでは、属性「sal%」を持つすべての行を選択し、メイン クエリでフィルタリングします。
select *
FROM (select id,value from EAV where attr like 'sal%')
WHERE to_number(value) > 5000;
このクエリ フォールにより、オプティマイザはサブクエリを外部クエリとマージします。DB をマージした後、列「値」のすべての値に to_number を適用しようとしましたが、その一部に文字列値が含まれています。魔女のヒントは、この最適化を妨げますか?
psと同じ結果を得たい
WITH t as (
select /*+ materialize */ id,value
from eav
where attr like 'sal%')
select * from t where to_number(value) > 5000;
ただし、CTEなし。