階層データを含むテーブルがあります-次のようなものです:
childID | parentID
____________________
1 | 5
5 | 9
9 | 20
2 | 4
3 | 7
7 | 8
8 | 8
20 | 20
4 | 4
8 | 8
必要な出力:
トップを見つける再帰CTEを作成しましたfatherID
。
何かのようなもの:
;WITH cte AS (
SELECT a.childID
,a.parentID
,1 AS lvl
FROM [Agent_Agents] a
WHERE a.childID = 214 //<==== value to begin with !! - thats part the problem
UNION ALL
SELECT tmp.childID
,tmp.parentID
,cte.lvl+1
FROM [Agent_Agents] tmp
INNER JOIN cte ON tmp.childID = cte.parentID
WHERE cte.childID<>cte.parentID
)
SELECT *
FROM cte
WHERE lvl = (
SELECT MAX(lvl)
FROM cte
)
問題:
(214)で始まる明示的な 値でCTEを実行しました!childID
したがって、214の値のみが得られます。CTEは再帰的な部分を実行し、childIDのtopParentを見つけます。
しかし、
私はForEach row in the Table
-値を使用してCTEを実行したいchildID
です!
私はそれをしようとしましたCROSS APPLY
:
何かのようなもの:
select * from myTable Cross Apply (
;WITH cte AS (....)
)
しかし、私見(私のテストから!!)-それは不可能です。
再帰CTEをUDFに配置するという別のアイデアには、パフォーマンスの低下があります(私たちが知っているようにudfの問題)。
実際に機能するようにこのクエリを作成するにはどうすればよいですか?(またはいくつかの近い解決策)?
これが私が試したことです
https://data.stackexchange.com/stackoverflow/query/edit/69458