首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >SQL中的层次结构

SQL中的层次结构
EN

Stack Overflow用户
提问于 2011-08-04 18:43:14
回答 4查看 427关注 0票数 0

我们有一个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中的

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-08-04 19:04:57

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

然后第一步是找到大老板--这应该是没有老板的用户-- report_to是空的。他的军衔是1。

第二步是找到他的第一个方向。他们将排在第二位。就像:

代码语言:javascript
运行
复制
UPDATE TABLE SET RANK = 2 
WHERE report_to IN 
 (SELECT username FROM TABLE WHERE RANK = 1)

第三步是找到指挥的方向。类似于:

代码语言:javascript
运行
复制
UPDATE TABLE SET RANK = 3 
WHERE report_to IN 
 (SELECT username FROM TABLE WHERE RANK = 2)

接下来的步骤与步骤2和步骤3相同,直到没有找到秩=0为止。

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

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

代码语言:javascript
运行
复制
UPDATE TABLE SET RANK = 50 - RANK

或者确保你不会错过任何东西:

代码语言:javascript
运行
复制
UPDATE TABLE SET RANK = (SELECT MAX(RANK) FROM TABLE) + 1 - RANK
票数 1
EN

Stack Overflow用户

发布于 2011-08-04 21:44:10

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

票数 1
EN

Stack Overflow用户

发布于 2011-08-04 18:51:48

哇..。那么,您有用户表吗?如果没有,那么建议1就是创建一个。

代码语言:javascript
运行
复制
users_table
------------
username
user_id
name_first
name_last
other_stuff_?

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

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

代码语言:javascript
运行
复制
user_user
-----------
user_id_1
user_id_2
relationship
begin_dt
end_dt

然后,您可以使用每个用户到用户的关系以及它有效的时间填充这个新表。例如,用户48与用户50相关,从某一天开始,关系=‘管理’

这段关系应该是另一张桌子的fk。但我把这个留给你做个节选。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6946841

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档