質問
再帰的な CTE クエリがありますが、ループが作成されると失敗します。単純なループ (例: 1 -> 2 -> 1) は既に修正しましたが、より複雑なループ (例: 1 -> 2 -> 3 -> 2) は修正できません。
クエリの詳細
テスト テーブルには、Base と Parent の 2 つの列があります。すべての祖先のリストが必要です。
私のクエリは、test2 から開始すると以下のサンプル データに対して機能しますが、test1 から開始すると機能しません。
サンプルデータ
Base Parent
---- ------
test1 test2
test2 test3
test3 test2
SQL クエリ (試行した修正はコメントでマークされています)
;with sample_data (Base, Parent) as (
select 'test1', 'test2'
union select 'test2', 'test3'
union select 'test3', 'test2'
),
nt_list (Base, Ancestor, [level]) as (
select Base,
Parent Ancestor,
1 [level]
from sample_data
where Base = 'test1' -- START HERE
union all
select ntl.Base,
nt.Parent,
ntl.[level] + 1 [level]
from nt_list ntl
join sample_data nt on ntl.Ancestor = nt.Base
where nt.Parent <> ntl.Base -- fix recursive bug (e.g. 1 -> 2 -> 1)
-- WHAT I TRIED TO ADD BUT CANNOT: (e.g. 1 -> 2 -> 3 -> 2)
and nt.Parent in (select Ancestor from nt_list)
)
select distinct
ntl.Base,
ntl.Ancestor
from nt_list ntl
order by Ancestor
SQL エラー: 共通テーブル式 'nt_list' の再帰メンバーに複数の再帰参照があります。