Oracle で、ビューを完全にアンラップする簡単な方法はありますか? 例: 複数のビューの選択で構成されるビューがある場合、それをアンラップして実際のテーブルを直接選択する方法はありますか?
3 に答える
ビューのクエリテキストを取得します。
SELECT text FROM dba_views WHERE owner = 'the-owner' AND view_name = 'the-view-name';
解析します。クエリテキスト内のビュー名を検索します。
見つかった各ビュー名のクエリテキストを取得します。(項目1を参照してください。)
クエリ内の各ビュー名を関連するクエリテキストに置き換えます。
ビューが見つからなくなるまで、これを再帰的に実行します。
簡単?
編集: 上記の手順は、必要なすべてを行うわけではありません。これについてもう少し考えてみると、毛むくじゃらになり、足が伸び、おそらく別の腕になります。列名、および複雑な関数やサブクエリである可能性のある列名を検索します。結合と句を使用してすべてを元に戻します。結果のクエリは非常に見苦しいかもしれません。
Oracle内のどこかに、実際にビューをアンラップしているものがある可能性があります。知らない。Oracleでビューをあまり使用しなかったのはうれしいです。
これを行うには、インライン ビューの概念を使用できます。次の 2 つのビューがあるとします。
create or replace view london_dept as
select * from dept
where loc = 'LONDON';
と
create or replace view london_mgr as
select * from emp
where job='MANAGER'
and deptno in (select deptno from london_dept);
2 番目のビューの SQL では、ビュー london_dept への参照は、次のように london_dept ビュー定義の SQL を使用してインライン ビューに置き換えることができます。
select * from emp
where job='MANAGER'
and deptno in (select deptno from (select * from dept
where loc = 'LONDON'));
もちろん、これは非常に冗長であり、次のように簡略化できることがわかります。
select * from emp
where job='MANAGER'
and deptno in (select deptno from dept where loc = 'LONDON');
最後に、ビューのビューを作成することの長所と短所に関する Tom Kyte からのアドバイス