sql >> Databasteknik >  >> RDS >> Sqlserver

SQL Server-funktion för att få överordnade på toppnivå i hierarkin

Med rekursiv cte från topp till barn:

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

För data:

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)

den genererar utdata:

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

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



  1. Hur funktionen TRANSLATE() fungerar i SQL Server (T-SQL)

  2. C# clr udf för Active Directory-gruppmedlemskap

  3. ta bort millisekunder från ett oracle tmstmp-fält

  4. Hur minskar man många liknande korrelerade underfrågor?