我们有一个sql数据库,它使用一个表( employees ),该表有一个列report_to,该列包含该雇员向其报告的人的用户名。我们要做的是把这个表示法变成一个数值表示法。例如:
'a‘向'b’报告'c‘。所以这个表达式应该是'a‘= 49,'b’= 50,'c‘= 51。如果'd‘变成’c‘的老板,那么'd’= 52。如果“a”成为实习生“e”和“f”的主管,那么e和f都等于48。
如图所示,从非零数开始的数字不仅允许向上扩展,而且还可以向下扩展层次链。
主要问题是,如何将当前结构("report_to")转换为数字表示?
注意:这是MSSQL中的
发布于 2011-08-04 19:04:57
您可以添加一个应该为0的新列(秩)。
然后第一步是找到大老板--这应该是没有老板的用户-- report_to是空的。他的军衔是1。
第二步是找到他的第一个方向。他们将排在第二位。就像:
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相同,直到没有找到秩=0为止。
所有这些步骤都可以在一个过程中完成,在WHILE语句中完成。
最后,如果您想从50开始,而不是从1开始,那么您可以进行更新:
UPDATE TABLE SET RANK = 50 - RANK
或者确保你不会错过任何东西:
UPDATE TABLE SET RANK = (SELECT MAX(RANK) FROM TABLE) + 1 - RANK
发布于 2011-08-04 21:44:10
如果表中有包含员工主管的字段,则可以使用追溯式CTE获取层次结构。如果您有任何问题,请在ONline图书中查找并回复我们。
发布于 2011-08-04 18:51:48
哇..。那么,您有用户表吗?如果没有,那么建议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相关,从某一天开始,关系=‘管理’
这段关系应该是另一张桌子的fk。但我把这个留给你做个节选。
https://stackoverflow.com/questions/6946841
复制相似问题