私はT-SQLのCTEに不慣れですが、それらを愛しています。ただし、作成しているこの特定のストアドプロシージャのロジックを正しく取得できません。
Table A
列で与えられる:
Id Name Inherits ...
列Inheritsは、この同じテーブルの別の行へのIDであるintを格納します。
そしてTable B
列で:
Id Name AId ...
ここで、AIdは表Aの行への外部キーです。
CTEを使用して、の任意の行(x
)から開始し、のA
すべての行を収集してから、xを。B
がAId = x.Id
指す行に設定することにより、Aで上向きに再帰する方法を教えてx.Inherits
ください。これはまで続行する必要がありますx.Inherits IS NULL
。
したがって、全体的な効果は、開始A Idの関連するB行を返し、次にAのInherits列を再帰的に調べることによって検出したすべての継承されたB行を返したいということです。
私の考えは、任意の行からAの「ルート」に再帰するようにCTEを設定することです。各再帰呼び出しの内部には、BへのJOINがあります。これは私が得た限りです。
WITH c
AS
(
SELECT A.Inherits,A.Id, B.Name, 1 AS Depth
FROM tbl_A A
INNER JOIN tbl_B B ON B.AId = A.Id
WHERE A.Id = @ArbitraryStartingAId
UNION ALL
SELECT T.Inherits,T.Id, c.Name, c.Depth + 1 AS 'Level'
FROM tbl_A T
INNER JOIN c ON T.Id = c.Inherits
)
SELECT *
FROM c
生成するもの:
1 4 b_val 1
11 1 b_val 2
NULL 11 b_val 3
どこb_val
からTable B row (y)
どこへ@ArbitraryStartingAId = y.AId
。Aの再帰は機能していますが、反復ごとに対応する正しいBデータを取得していません。
誰かがこれを書き直して私が必要とする結果を生み出すのを手伝ってくれるなら、それは素晴らしいことです。
どうもありがとう