次の再帰 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」でフィルタリングするだけでは十分ではありませんか?