我有一个存储父级和子级ID的表,一个id可以有多个子类别,子类别可以有其他类别,并且可以继续)我有两列“id”和“parentid”来存储该信息。< / p>
我需要填充解释类别层次结构级别的第三列“级别”,以便所有没有子级的类别都具有level = 1 ,从父类别继承的子类别将具有level = 2,类似地,从继承自主要父类别的子目标继承的所有子类别将具有level = 3 ...并且这将遵循
如何在此填充“级别”字段
答案 0 :(得分:0)
就像你描述的那样:首先更新所有记录帽子没有孩子获得1级,然后他们的父母获得2级等等。因为你没有说出DBMS既不是你想要使用的语言,下面包含一些伪代码:
<declare and initialize a variable "@lvl" to 1>
-- SQL:
update category set level = 1
where not exists(select 1
from category as parent
where catergory.parentId = parent.id)
<while the last update updated some rows>
-- SQL:
update category set level = @lvl + 1
where exists(select 1
from category as child
where child.parentId = category.id
and child.level = @lvl)
<increment lvl by 1>
<end of while loop>
答案 1 :(得分:0)
假设您正在使用MS SQL SERVER,您可以使用自引用(或递归)CTE
;WITH CTE (id, p_id, level)
AS
(SELECT s.id, null,1
FROM table1 s
where parent_id is null
UNION ALL
SELECT s.id,parent_id,m.level + 1
FROM CTE m
JOIN table1 s on m.id = s.parent_id
)
update table1 set level = c.level
from cte c
where table1.id = c.id;