0

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句の一部にならないように、これをどのように書き直すべきか、誰かが私を正しい方向に向けることができますか?

前もって感謝します。

4

1 に答える 1

1

現在のノードがリーフの場合は 1 を返し、それ以外の場合は 0 を返す疑似列を使用できるCONNECT_BY_ISLEAFため、クエリは次のように書き直す必要があります。

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 疑似列

于 2013-11-01T22:21:06.057 に答える