3

次の再帰 CTE を考えると (私の例では少し単純化されています):

    WITH myCTE (sort, parentid, myid, level, somedata)
AS
(
-- Anchor member definition
    SELECT 
        CAST(ROW_NUMBER() OVER(ORDER BY o.myid) as decimal(38, 20)) as sort,
        o.parentid, 
        o.myid, 
        0 as level, 
        o.somedata
    FROM 
        table1 t1,
        table2 t1,
        datatable o
    WHERE t1.somebool = 1 AND t2.id = t1.foreignid and o.foreignkey = t2.key
        and o.parentid = ''
    UNION ALL
-- Recursive member definition
    SELECT
        CAST(b.sort + (ROW_NUMBER() OVER(ORDER BY o.myid) / power(10.0, b.level + 1)) as decimal(38, 20)) as sort,
        o.parentid, 
        o.myid, 
        b.level + 1, 
        o.somedata
    FROM datatable o
    INNER JOIN myCTE AS b
        ON o.parentid = b.myid

一般的な考え方は次のとおりです: テーブル 1 とテーブル 2 に基づく項目の選択から始めて、クエリを開始し、アンカーで親のないすべてのデータを検索し、メイン項目を持つデータと結合したいすべてのデータが見つかるまで掘り続けます。見つかった最大レベルは 7 ですが、深さがわからない木を扱っています。

再帰メンバーに追加の制限を適用すると便利ですか? アンカーからコピーする制限が多いほどうまくいくようですが、「o.parentid = b.myid」でフィルタリングするだけでは十分ではありませんか?

4

1 に答える 1