私は、二重または三重親を持ついくつかのキーがある階層データを扱っています。共有メンバー(二重親メンバー)を持つOracle階層
階層を表す階層クエリを作成する必要がありますが、この2重または3重の親キーはツリー内に単独で表示され、その子は3つのキーの最初のキーでのみ表示されます。
WITH HER(CHILD, PARENT) AS (
SELECT 'A' AS CHILD, null AS PARENT FROM DUAL UNION
SELECT 'B' AS CHILD, 'A' AS PARENT FROM DUAL UNION
SELECT 'C' AS CHILD, 'A' AS PARENT FROM DUAL UNION
SELECT 'D' AS CHILD, 'C' AS PARENT FROM DUAL UNION
SELECT 'E' AS CHILD, 'D' AS PARENT FROM DUAL UNION
SELECT 'F' AS CHILD, null AS PARENT FROM DUAL UNION
SELECT 'G' AS CHILD, 'F' AS PARENT FROM DUAL UNION
SELECT 'C' AS CHILD, 'G' AS PARENT FROM DUAL UNION --<<--- shared
SELECT 'H' AS CHILD, null AS PARENT FROM DUAL UNION
SELECT 'B' AS CHILD, 'H' AS PARENT FROM DUAL UNION --<<--- shared
SELECT 'X' AS CHILD, null AS PARENT FROM DUAL UNION
SELECT 'Y' AS CHILD, 'X' AS PARENT FROM DUAL UNION
SELECT 'Z' AS CHILD, 'Y' AS PARENT FROM DUAL UNION
SELECT 'C' AS CHILD, 'Z' AS PARENT FROM DUAL --<<--- shared
)
SELECT
LPAD(' ', 7*(LEVEL-1),' ')||CHILD||' - '||PARENT
FROM HER
START WITH PARENT IS NULL
CONNECT BY PRIOR CHILD = PARENT
;
このクエリからの結果は、このですが、それは私が取得しようとしているまさにではありません。
----------
A -
B - A
C - A
D - C
E - D
F -
G - F
C - G
*D - C*
*E - D*
H -
B - H
X -
Y - X
Z - Y
C - Z
*D - C*
*E - D*
行D-CとE-Dは、単に「C」キーの最初の出現にdisplayinする必要があります。だから私が「*」と書いたものは現れてはいけません。
私はこの二重の親キーを特定し、これに基づいて行を除外する二次照会を作成することができます。 しかし、それを行う最短の方法があるかどうか疑問に思っています。ハイライトそのものを使って作業しています...もし既にキーが別の親を持っていることを知る方法があれば。 (これはビューになるので、PL/SQLではなくクエリでこれを行う必要があります)
ありがとうございます。
「最初の」発生とはどういう意味ですか?結果セット内の行は順序付けされていません(バスケットの中のボールのようなものです)ので、質問はあまり意味がありません。結果セットのすべての行は、(おそらく論理的にはベクトル化された処理によって物理的にも)同時に生成されます。だから、あなたが「最初」の意味を明確にしても、1回のパスでこれを行うことはできません。 – mathguy