2012-04-24 9 views
3

私はcteで悩んでいます 最初の親がnullのクエリが欲しいです。 と透過的な親の子は、次の親となります。再帰CTEを持つ親/子ツリーをウォークしますか?

WITH RESULT (PARENT,CHILD,TNAME,LEVEL) 
AS 
(
--anchor 
SELECT E.PARENT_GENERAL_KEY,E.M_GENERAL_KEY,E.NAME ,0 AS LEVEL 
    FROM RPT_SYN_M_GENERAL AS E 
WHERE E.PARENT_GENERAL_KEY IS NULL 
UNION ALL 
--outer 
SELECT e.PARENT_GENERAL_KEY,E.M_GENERAL_KEY,e.NAME ,LEVEL +1 
FROM RPT_SYN_M_GENERAL AS E 
INNER JOIN RESULT AS D 
ON E.PARENT_GENERAL_KEY=D.CHILD 
) 
SELECT PARENT,CHILD,TNAME,LEVEL FROM RESULT as d 
order by PARENT,CHILD 

上記は私の質問です。 最後の子供まで繰り返してください。

私が持っている出力は次のようになります。

PARENT CHILD TNAME    LEVEL 
    NULL 0  ACCOUNT_MASTER  0 
    0 1  LIABILITIES   1 
    0 2  ASSETS    1 
    0 3  INCOME    1 
    0 4  EXPENSE    1 
    0 15003 POLISHED DIAMOND  1 
    0 15004 DEMO     1 
    0 15005 DEMO (FACTORY  1 
    1 238  CAPITAL A/C.   2 
    1 1067 PROVISION    2 
    1 1284 SECURED LOANS   2 
    1 2968 UNSECURED LOANS  2 
    1 3535 SHARE HOLDERS   2 
    2 484  FIXED ASSETS A/C  2 
    2 3301 INVESTMENTS   2 
    2 4858 CURRENT ASSETS  2 
    2 4859 LOANS ADVANCES  2 
    3 867  OTHER INCOME   2 
    3 1246 SALES     2 

私が望む出力は次のとおりです。

PARENT  CHILD TNAME    LEVEL 
    null  0       0 
    0  1       1 
    1  238      2 
    238  982      3 
    982  26       4 
    982  894      4   
    982  1321      4 
    238  7757      3 
    7757  7521      4 
+0

uはデモビューを取り、それをあなたの方法をやってみてくださいすることができますが、RPT_SYN_M_GENERAL –

+0

のサンプルを公開する必要がありますように見えます。親キー、子キー、レベルがあるはずです – Amita

+0

入力テーブルのサンプルを提供しますか? – Peter

答えて

0

あなたの基礎となる表を見なければ、私は、任意の提案をテストすることはできません。それぞれで1位にランク

WITH RESULT (PARENT,CHILD,TNAME,LEVEL) 
AS 
(
--anchor 
SELECT E.PARENT_GENERAL_KEY,E.M_GENERAL_KEY,E.NAME ,0 AS LEVEL 
    FROM RPT_SYN_M_GENERAL AS E 
WHERE E.PARENT_GENERAL_KEY IS NULL 
UNION ALL 
--outer 
SELECT D.CHILD,D.PARENT,e.NAME ,LEVEL +1 --switched parent/child 
FROM RPT_SYN_M_GENERAL AS E 
INNER JOIN RESULT AS D 
ON E.PARENT_GENERAL_KEY=D.CHILD 
WHERE LEVEL<100 
) 
SELECT PARENT,CHILD,TNAME,LEVEL FROM RESULT as d 
order by PARENT,CHILD 
+0

返信ありがとうございます。ジョン。 それは を示しています。文の完了前に最大再帰100が使い尽くされました。 – Amita

+0

私は以前これをやってみましたが、うまくいきませんでした。 私は親と子を選択したいと思います。 次のレコードは、前のレコードの子が親であるべき のレコードでなければなりません。 、すべての子が反復されるまで同じことが続きます。 – Amita

+0

おそらく、明示的にPARENTとCHILDのエイリアスを参照することをお勧めします。また、LEVELリミッターにも注意してください。 –

0

、指定した出力のために、あなたのCTEの行をランク付けする必要があり、その後、あなただけの行をフィルター:しかし、あなたが外側のクエリで親と子をswtichとどうなるか見て繰り返し。

WITH RESULT (ROW_RANK, PARENT,CHILD,TNAME,[LEVEL]) 
AS 
(
--anchor 
SELECT RANK() OVER (ORDER BY E.M_GENERAL_KEY), E.PARENT_GENERAL_KEY,E.M_GENERAL_KEY,E.NAME ,0 AS [LEVEL] 
    FROM RPT_SYN_M_GENERAL AS E 
WHERE E.PARENT_GENERAL_KEY IS NULL 
UNION ALL 
--outer 
SELECT RANK() OVER (ORDER BY E.M_GENERAL_KEY), E.PARENT_GENERAL_KEY,E.M_GENERAL_KEY,E.NAME, D.[LEVEL] +1 
FROM RPT_SYN_M_GENERAL AS E 
INNER JOIN RESULT AS D 
ON E.PARENT_GENERAL_KEY=D.CHILD AND ROW_RANK = 1 
) 
SELECT PARENT,CHILD,TNAME,LEVEL FROM RESULT as d 
WHERE ROW_RANK = 1 
order by PARENT,CHILD 
関連する問題