Как получить иерархические отношения для организационных единиц на основе иерархии позиций - PullRequest
0 голосов
/ 07 мая 2019

У меня есть таблица, содержащая некоторые данные HR, включая (среди прочих деталей) идентификатор позиции, идентификатор родительской позиции и идентификатор подразделения org.

Что-то вроде

pos_id | parent_pos_id | pos_name            | org_id | org_name
   1   |     null      | CEO                 |   A    | Executive
   2   |       1       | Assistant           |   A    | Executive
   3   |       1       | IT Director         |   B    | Information Technology
   4   |       1       | Finances Director   |   C    | Finances
   5   |       3       | Systems Leader      |   B    | Information Technology
   6   |       5       | Database Manager    |   B1   | Database Systems
   7   |       5       | Application Manager |   B2   | OS and Applications
   8   |       4       | Finances Leader     |   C    | Finances
   9   |       4       | Financial Assistant |   C    | Finances
  10   |       8       | Payroll Manager     |   C1   | Payroll    

иМне нужно получить информацию об идентификаторе родительского подразделения org для каждой записи, основываясь на иерархических отношениях позиции.

Итак, для приведенного выше примера желаемым выводом будет:

org_id | parent_org_id
   A   |      null
   B   |       A
   C   |       A
  B1   |       B
  B2   |       B
  C1   |       C

Можно ли создать запрос для получения этого в базе данных SQL Server?

Ответы [ 2 ]

1 голос
/ 07 мая 2019

Для этого вам нужно написать рекурсивный CTE, код псевдо ниже

with cte as 
(
 select org_id,parentorg_id,pos_id,parentpos_id from hrtable where parentpos_id is null
 UNION ALL
 select org_id,parentorg_id,pos_id,parentpos_idfrom hrtable t join cte c on t.parentpso_id=c.pos_id
)
select org_id,parentorg_id from cte c
1 голос
/ 07 мая 2019

использование self join

ДЕМО

select  a.org_id as org_id,b.org_id as parentorgid
from t1 a
left join t1 b on a.parent_pos_id=b.pos_id
where a.org_id<>b.org_id or b.org_id is null

ВЫХОД:

org_id  parentorgid
A   
B         A
C         A
B1        B
B2        B
C1        C
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...