我有下表(master_group)结构:

code    name                      under

1       National Sales Manager    1
2       regional sales manager    1
3       area sales manager        2
4       sales manager             3

如何获得特定行的最终父级,例如:
code    name                      under     ultimateparent

1       National Sales Manager    1         1
2       regional sales manager    1         1
3       area sales manager        2         1
4       sales manager             3         1

最佳答案

随着递归 cte 从上到下:

with cte as(
  select *, code as ultimate from t where code = under
  union all
  select t.*, c.ultimate from t
  join cte c on c.code = t.under
  where t.code <> t.under
)
select * from cte

对于数据:
create table t (code int, name varchar(100), under int)
insert into t values
(1, 'National Sales Manager', 1),
(2, 'regional sales manager', 1),
(3, 'area sales manager', 2),
(4, 'sales manager', 3),
(5, 'a', 5),
(6, 'b', 5),
(7, 'c', 5),
(8, 'd', 7),
(9, 'e', 7),
(10, 'f', 9),
(11, 'g', 9)

它生成输出:
code    name                    under   ultimate
1       National Sales Manager  1       1
5       a                       5       5
6       b                       5       5
7       c                       5       5
8       d                       7       5
9       e                       7       5
10      f                       9       5
11      g                       9       5
2       regional sales manager  1       1
3       area sales manager      2       1
4       sales manager           3       1

fiddle http://sqlfiddle.com/#!6/17c12e/1

关于用于获取层次结构中的顶级父级的 SQL Server 函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30286834/

10-12 06:07