【问题标题】:Rewriting Subquery Within Select Due to Oracle Materialized View Limitation由于 Oracle 物化视图限制,在 Select 内重写子查询
【发布时间】:2013-11-02 06:21:06
【问题描述】:

Oracle 在创建实体化视图时限制在 select 子句中使用子查询。执行此操作时,您会收到错误“ORA-22818:此处不允许子查询表达式”。

由于这个限制,我一直在努力重写查询并将子查询移出 select 子句。该查询使用父/子关系递归地构建路径,我还试图通过将表连接回自身并查看记录是否有子项来指示特定类别是否为叶类别。

SELECT A.PRODUCTCATEGORYID, A.PARENTCATEGORYID, SYS_CONNECT_BY_PATH(A.LABEL, ':') "PATH", 
(
        SELECT CASE WHEN MAX(PRODUCTCATEGORYID) IS NOT NULL THEN 0 ELSE 1 END 
        FROM PRODUCT_CATEGORY
        WHERE parentcategoryid = A.PRODUCTCATEGORYID
) as "LEAF"
FROM PRODUCT_CATEGORY A
CONNECT BY PRIOR A.PRODUCTCATEGORYID = A.PARENTCATEGORYID
START WITH A.PARENTCATEGORYID IS NULL;

谁能指出我应该如何重写它以使子查询不属于 select 子句的正确方向?

提前致谢。

【问题讨论】:

    标签: oracle subquery materialized-views


    【解决方案1】:

    您可以使用CONNECT_BY_ISLEAF 伪列,如果当前节点是叶子,则返回 1,否则返回 0,因此您的查询应该这样重写:

    SELECT A.PRODUCTCATEGORYID, A.PARENTCATEGORYID, SYS_CONNECT_BY_PATH(A.LABEL, ':') "PATH", 
      CONNECT_BY_ISLEAF as "LEAF"
    FROM PRODUCT_CATEGORY A
    CONNECT BY PRIOR A.PRODUCTCATEGORYID = A.PARENTCATEGORYID
    START WITH A.PARENTCATEGORYID IS NULL;
    

    阅读 Oracle 文档的更多信息:CONNECT_BY_ISLEAF pseudocolumn

    【讨论】:

    • 这正是我所寻找的,而且比我尝试使用连接时要简单得多。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-24
    • 1970-01-01
    • 2021-09-14
    • 2021-04-29
    • 2018-08-23
    • 1970-01-01
    • 2023-04-11
    相关资源
    最近更新 更多