由于Oracle物化视图限制而在Select中重写子查询

时间:2013-11-01 21:28:48

标签: oracle subquery materialized-views

在创建物化视图时,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子句的一部分吗?

提前致谢。

1 个答案:

答案 0 :(得分: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