开发层次查询

时间:2015-03-27 18:25:07

标签: sql sql-server

我创建了下面列表中显示的场景,以便您更清楚地理解我的问题。

我想开发一个旋转光标,使我能够找到组织金字塔底部任何代理的最高领导者。

考虑好像您拥有的唯一信息是下面列表中显示的每个人的直接上线。你能帮助我开发一个查询,使用sql游标检索每个代理的最高领导者的名字和staff_id吗?

然后我会尝试为我的公司开发一个光标,它有一个类似的员工组织,但更复杂。仅使用游标或循环查询非常感谢。

Staff_id Name    Title               Upline      Upline_id
-------- ------- ------------------- ----------- ---------
1        Peter   Agent               Fred        10
2        Paul    Agent               Fred        10
3        Michael Agent               Fred        10
4        George  Agent               Rick        11
5        Will    Agent               Rick        11
6        Jeff    Agent               Rick        11
7        Mark    Agent               Deon        12
8        Alberto Agent               Deon        12
9        Charles Agent               Deon        12
10       Fred    Leader              Aaron       13
11       Rick    Leader              Zack        14
12       Deon    Leader              Brown       15
13       Aaron   General Manager     Milton      16
14       Zack    General Manager     Nancy       17
15       Brown   General Manager     Nick        18
16       Milton  District Manager    Ken         19
17       Nancy   District Manager    Miller      20
18       Nick    District Manager    Tad         21
19       Ken     Top Leader          Null        Null
20       Miller  Top Leader          Null        Null
21       Tad     Top Leader          Null        Null

1 个答案:

答案 0 :(得分:0)

对于像这样的层次结构,因为Lamak指出递归CTE是最好的方法。

WITH subordinates AS
(
SELECT     mt.name, mt.upline, mt.title
FROM       myTable mt
WHERE      Staff_id = 11

UNION ALL

SELECT     mt2.name, mt2.upline, mt2.title
FROM       subordinates  s
INNER JOIN myTable mt2
  ON       mt2.upline = s.name
)

SELECT    s.name, s.upline, s.title
FROM      subordinates  

此查询将获取Rick的所有下属。

但是,正如您所看到的,我必须加入名称,而上线列实际上应该包含工作人员的ID而不是名称。这样可以避免人员名称存在两次的问题,这将显示层次结构。