私は苦労している少しの問題を抱えています。親フィールドと子フィールドを使用してそれ自体を表すツリー構造を表すレガシーデータベースがあります。また、前のピア、次のピア、およびレベルのフィールドが含まれます。
私が抱える主な問題は、データベースがNULLを使用して関係の開始点と終了点を表すのではなく、-1を使用することです。
私がやろうとしているのは、特定の親のすべての子レコードを取得することです。
ID Parent PriorPeer NextPeer Child Level
0 0 -1 -1 1 0
1 0 -1 3 2 1
2 1 -1 -1 4 2
3 0 1 5 -1 1
4 2 -1 -1 -1 3
私は何とかCTEを書くことができました
;with temp as (
select * from source
where ID = 0
union all
select y.* from source y
inner join temp x on y.parent = x.ID
)
select * from temp
これは、0以外のすべてのID値に対して正常に機能します。ただし、トップレベルのparentIDが-1ではなく自分自身を参照するため、クエリは無限に繰り返されます。テーブルデータを変更せずにこの自己参照を解除する方法はありますか?
回答 3 件
フィールドParentを使用する場所ではなく、代わりに
case when Level=0 then -1 else Parent end as true_parent
親==子idのインスタンスをブロックする述語を追加するのと同じくらい簡単ですか?
with temp as ( select * from source where ID = 0 union all select y.* from source y inner join temp x on y.parent = x.ID and y.parent <> x.id ) select * from temp
を使用してループを解除できます
または