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