表中的父/子树

时间:2018-05-25 08:18:05

标签: sql sql-server

我遇到了一些我正在努力解决的问题。我有一个遗留数据库,它使用Parent和Child字段表示自身内部的树结构。它还包含Previous Peer,Next Peer和Level字段。

我遇到的主要问题是该数据库不使用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 个答案:

答案 0 :(得分:1)

无论您在何处使用字段Parent,请使用

case when Level=0 then -1 else Parent end as true_parent

答案 1 :(得分:1)

您可以使用

打破循环
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

答案 2 :(得分:0)

就像在父==子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