在sql查询中计算子类别的级别

时间:2014-02-11 18:05:43

标签: sql

我有一个存储父级和子级ID的表,一个id可以有多个子类别,子类别可以有其他类别,并且可以继续)我有两列“id”和“parentid”来存储该信息。< / p>

我需要填充解释类别层次结构级别的第三列“级别”,以便所有没有子级的类别都具有level = 1 ,从父类别继承的子类别将具有level = 2,类似地,从继承自主要父类别的子目标继承的所有子类别将具有level = 3 ...并且这将遵循

如何在此填充“级别”字段

2 个答案:

答案 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;