【问题标题】:View based on SELECT with 'WITH' clause基于带有 'WITH' 子句的 SELECT 视图
【发布时间】:2015-03-10 04:55:38
【问题描述】:

我选择了 'WITH' 子句:

with 
alias1 as (select...),
alias2 as (select ... from alias1),
alias3 as (select col1, col2 ... from alias2)
select col1,col2 from alias3 

我尝试使用以下方法创建视图:

create view ex_view as (
with 
alias1 as (select...),
alias2 as (select ... from alias1),
alias3 as (select col1, col2 ... from alias2)
select col1,col2 
from alias3
)

当我尝试执行此创建语句时,得到“不支持使用 WITH 子句”

如何根据我的选择语句正确地创建视图?

【问题讨论】:

  • 整个错误是什么?通常有一个Oracle错误号
  • col1col2 是否也存在于 alias1alias2 中?尝试select alias3.col1, alias3.col2 from alias3 并使用表名(或别名)限定所有其他列

标签: sql oracle sql-view


【解决方案1】:

尝试去掉括号:

create view ex_view as
with 
    alias1 as (select...),
    alias2 as (select ... from alias1),
    alias3 as (select col1, col2 ... from alias2)
from alias3;

【讨论】:

  • 此解决方案无法正常工作。我开始执行这段代码,过了 15 分钟,但服务器还没有创建视图。而不是这个,我的客户崩溃了。每次我尝试按照您的建议创建视图时都会崩溃。出了点问题。
  • @R.Nec 。 . .出了点问题,但如果是视图定义,我会感到非常惊讶。你可以创建 any 视图吗?可以单独运行查询吗?
  • @GordonLinoff 认为您在 from alias3 之前缺少 select col1, col2 语句? :)
  • 这解决了我的问题,我使用的是create table 而不是create view
【解决方案2】:

您不应该在查询周围有括号;将其更改为:

create view ex_view as (
with 
alias1 as (select...),
alias2 as (select ... from alias1),
alias3 as (select col1, col2 ... from alias2)
select col1,col2 
from alias3
)

例如:

create view ex_view as
with 
alias1 as (select dummy from dual),
alias2 as (select dummy as col1, dummy as col2 from alias1),
alias3 as (select col1, col2 from alias2)
select col1,col2 
from alias3;

View ex_view created.

查询周围带有括号的相同结构得到 ORA-32034: unsupported use of WITH clause too.

如果您实际上并没有在多于一级的查询中使用任何子查询 - 所以“公用表表达式”的“公用”部分并不真正相关 - 您可以改用内联视图:

create view ex_view as
select alias3.col1, alias3.col2
from (
  select col1, col2
  from (
    select dummy as col1, dummy as col2
    from (
      select dummy from dual
    ) alias1
  ) alias2
) alias3;

with 子句是有效的,而且通常更易于阅读和维护。

【讨论】:

  • 使用 WITH 子句可能会提高性能,因为在某些情况下,当 select Oracle 创建一个临时表并从中进行选择时。
  • @Wernfried - 它也可以实现内联视图,不是吗?如果不是,使用 CTE 的另一个有用的理由。我并不是说无论如何不要使用with,只是提供选项。
  • 我不知道Oracle是否可以实现内联视图。快速的谷歌搜索没有给我一个正确的答案。
  • @Wernfried 如果只使用一次中间行源,那么创建一个中间行源的全局临时表是个坏主意。
  • @AlexPoole - 我使用您发布的示例更改了代码,但执行失败,永远持续,最后我的客户端崩溃。每次我尝试创建这个视图。
【解决方案3】:

有没有办法用“WITH FUNCTION”子句创建视图。

CREATE OR REPLACE VIEW test$v AS 
    WITH
      FUNCTION with_function(p_id IN VARCHAR2) RETURN VARCHAR2 IS
      BEGIN
        RETURN p_id;
      END;
    SELECT with_function(dummy) AS dummy
    FROM   dual;
    /

这会产生一个错误:

ORA-06553: PLS-103: Encountered the symbol "end-of-file" 

【讨论】:

  • 对不起,我的错,这只是一个编辑器问题(PLSQL Developer 不支持),它在 SQL*Plus 下运行良好。
  • 找到答案了,斜线前的最后一个分号必须去掉。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-05-04
  • 1970-01-01
  • 1970-01-01
  • 2021-10-19
  • 1970-01-01
  • 1970-01-01
  • 2011-10-14
相关资源
最近更新 更多