bugfix> sql > 投稿

私は苦労している少しの問題を抱えています。親フィールドと子フィールドを使用してそれ自体を表すツリー構造を表すレガシーデータベースがあります。また、前のピア、次のピア、およびレベルのフィールドが含まれます。

私が抱える主な問題は、データベースが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 件
  • を使用してループを解除できます

    inner join temp x on y.parent = x.ID and y.ID > 0
    
    

    または

    inner join temp x on y.parent = x.ID and y.Level > 0
    
    

  • フィールド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
    
    

あなたの答え