【问题标题】:Fully unwrap a view完全展开视图
【发布时间】:2008-09-26 02:55:53
【问题描述】:

在 Oracle 中,有没有一种简单的方法可以完全展开视图?例如:如果我有一个由多个视图上的选择组成的视图,是否有某种方法可以将其展开以直接在真实表上进行选择?

【问题讨论】:

    标签: oracle views


    【解决方案1】:

    in-line views 的概念可以用来做到这一点。假设您有这 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);
    

    在第二个视图的 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 关于创建views of views 的优缺点的一些建议

    【讨论】:

      【解决方案2】:
      1. 获取视图的查询文本。

        SELECT text FROM dba_views
        WHERE owner = 'the-owner' AND view_name = 'the-view-name';
        
      2. 解析。在查询文本中搜索视图名称。

      3. 获取找到的每个视图名称的查询文本。 (见第 1 项。)

      4. 将查询中的每个视图名称替换为相关的查询文本。

      5. 递归执行此操作,直到找不到更多视图。

      容易吗?

      编辑:上述说明并不能满足所有要求。再想一想,它就会长毛,长出腿,也许还有另一条胳膊。查找列名,以及可能是复杂函数和子查询的列名。将它们与连接和子句重新组合在一起。生成的查询可能看起来很丑。

      在 Oracle 的某个地方,可能有一些东西实际上是在展开视图。我不知道。我很高兴我在 Oracle 中没有过多地使用视图。

      【讨论】:

        【解决方案3】:

        直到 Oracle 12.1,正确答案是否定的,没有简单的方法。现在,在 12.1 中有 DBMS_UTILITY.EXPAND_SQL_TEXT :在 Oracle 数据库 12c 第 1 版 (12.1) 中扩展对视图的 SQL 引用就是这样做的。见documentation of dbms_utility

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-05-10
          • 2020-03-09
          • 2014-08-08
          • 2014-08-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多