完全展开视图

时间:2020-03-06 14:45:47  来源:igfitidea点击:

在Oracle中,有没有一种简便的方法可以完全解开视图?例如:如果我有一个由更多视图上的选择组成的视图,是否有某种方法可以将其拆开以直接在实际表上选择呢?

解决方案

  • 获取视图的查询文本。
SELECT text FROM dba_views
WHERE owner = 'the-owner' AND view_name = 'the-view-name';
  • 解析。在查询文本中搜索视图名称。
  • 获取找到的每个视图名称的查询文本。 (请参阅第1项。)
  • 用相关的查询文本替换查询中的每个视图名称。
  • 递归执行此操作,直到找不到更多视图。

简单?

编辑:上面的说明不执行所需的所有操作。再多考虑一下,它就会变得毛茸茸,长腿,甚至可能是另一只手臂。查找列名以及可能是复杂函数和子查询的列名。将所有内容与联接和子句一起放回原处。结果查询可能看起来很丑陋。

Oracle中的某个地方可能确实在分解视图。我不知道。我很高兴我在Oracle中使用的视图不那么多。

内联视图的概念可用于执行此操作。假设我们有以下两个视图:

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);

在第二个视图的SQL中,可以使用london_dept视图定义中的SQL将视图london_dept的引用替换为嵌入式视图,如下所示:

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)就创建视图的优点和缺点提供了一些建议