我遇到了一些我正在努力解决的问题。我有一个遗留数据库,它使用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而分崩离析,查询只是无休止地重复。有没有办法可以在不改变表格数据的情况下打破这种自我引用?
答案 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