Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Функция на SQL Server за получаване на родител от най-високо ниво в йерархията

С рекурсивен 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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Липсващ артефакт com.microsoft.sqlserver:sqljdbc4:jar:4.0

  2. Разбиране на QUOTED_IDENTIFIER

  3. Планирано изпълнение на съхранената процедура на SQL сървър

  4. Кумулативна сума на SQL Server по групи

  5. Съпоставяне в SQL Server