SQL中的层次结构

时间:2011-08-04 18:43:14

标签: sql-server

我们有一个sql数据库正在使用一个表,员工有一个列,report_to,其中包含该员工报告的人员的用户名。我们想要做的是将此表示更改为数字表示。例如:


'a'报告'b'向'c'报告。因此,表示将类似于'a'= 49,'b'= 50,'c'= 51.如果'd'变为'c'的老板,则'd'= 52.如果'a'变为实习生'e'和'f'的主管,然后'e'和'f'都等于48。


如图所示,以非零数字开头的数字不仅可以向上扩展,还可以向下扩展分层链。

主要问题是,如何从当前结构(“report_to”)转换为数字表示?

注意:这是在MSSQL中

4 个答案:

答案 0 :(得分:1)

您可以添加一个应为0的新列(排名)。

然后第一步是找到BIG BOSS - 这应该是没有boss的用户 - report_to为null。他的等级是1。

第二步是找到他的第一个指示。他们将排名为2.像:

UPDATE TABLE SET RANK = 2 
WHERE report_to IN 
 (SELECT username FROM TABLE WHERE RANK = 1)

第三步是找到指示的指示。类似的东西:

UPDATE TABLE SET RANK = 3 
WHERE report_to IN 
 (SELECT username FROM TABLE WHERE RANK = 2)

接下来的步骤与步骤2和3相同,直到找不到RANK = 0.

所有这些步骤都可以在WHILE语句中的过程中完成。

最后,如果您想从50开始排名而不是1,那么您可以进行更新:

UPDATE TABLE SET RANK = 50 - RANK

或确保你不会遗漏任何东西:

UPDATE TABLE SET RANK = (SELECT MAX(RANK) FROM TABLE) + 1 - RANK

答案 1 :(得分:1)

如果您的表中包含员工主管的字段,则可以使用重复CTE来获取层次结构。如果您有任何问题,请在Books ONline中查找并​​回复我们。

答案 2 :(得分:0)

哇...所以你有一张用户表吗?如果没有,那么建议1是创建一个。

users_table
------------
username
user_id
name_first
name_last
other_stuff_?

然后用所有现有的用户名填充它 - 可能通过查询您描述的用于唯一名称的表。在此步骤中,user_id将被填充为有序的id值。

然后你可以添加一个新表,

user_user
-----------
user_id_1
user_id_2
relationship
begin_dt
end_dt

然后您可以将这个新表与每个用户填充到用户关系以及何时有效。例如用户48与某天开始的用户50相关,其中relationship ='Manages'

关系应该可能是另一张桌子的fk ......但我把它留给你作为一个练习。

答案 3 :(得分:-2)

在我看来,你不需要使用数字计数器,只需使用位置,因为你不能拥有无限的位置,它会停在某个地方。每个用户名都应该有一个职位,如实习生,主管,雇主,项目经理或其他任何人。当你改变时,让实习生的位置更高,那么主管就会成为雇主或类似的东西。你明白了。 :)