родительские данные в той же строке условно - PullRequest
0 голосов
/ 08 ноября 2019

У меня есть таблица с именем EmployeeLevel

Id     Position ShouldApproveLeave
1000     1         0
2000     2         1
3000     3         0
4000     4         0

Обратите внимание, что столбец bool ShouldApproveLeave имеет значение true только для одной строки

У меня есть таблица Employee со следующейструктура с LevelId в качестве внешнего ключа для EmployeeLevel

Id     ParentId  Name   LevelId
1000   NULL      Jack    1000
2000   1000      John    2000
3000   2000      Nick    3000
4000   3000      James   4000

Мне нужен запрос для получения сведений о сотруднике, должности, а также менеджера, ответственного за утверждение его отпуска, как показано ниже

запрос (id = 4000)

Id     Name    LevelPosition  LeaveApprovalLevel LeaveApprovingManager 
4000   James    4                   2                  John

запрос (id = 3000)

Id     Name    LevelPosition  LeaveApprovalLevel LeaveApprovingManager 
3000   Nick       3                  2                 John

запрос (id = 2000)

Id     Name    LevelPosition  LeaveApprovalLevel LeaveApprovingManager 
2000   John       2                  2                 John

Также я хочу проверитьоставьте утверждающего менеджера только вверх в иерархии.

запрос (id = 1000)

Id     Name    LevelPosition  LeaveApprovalLevel LeaveApprovingManager 
1000   Jack    1                 2               NULL

Я написал CTE для получения менеджера с установленным битом LeaveApproving. Получить работника с уровнем также просто. Моя задача - собрать все эти детали в одном ряду.

Таким образом, вопрос на самом деле в том, что я получил индивидуальные результаты для сотрудников и менеджера по выдаче разрешения. Как я могу получить это в одной строке?

Мне удалось получить отдельные запросы для следующих

сведений о сотруднике

 Id     ParentId  Name   Position 
 4000   3000      James   4

LeaveApprovalLevel  details

Level
2

LeaveApprovingManager details

 Id     ParentId  Name   
 2000   1000      John  

Как я могу присоединиться к ним, чтобы яполучит это?

Id     Name    LevelPosition  LeaveApprovalLevel LeaveApprovingManager 
4000   James    4                   2                  John

Любые советы приветствуются.

Ответы [ 2 ]

0 голосов
/ 08 ноября 2019

попробуйте

SELECT e1.Id, e1.Name, el1.Position as LevelPosition, el2.Position as LeaveApprovalLevel,  e2.Name as LeaveApprovingManager FROM Employee e1 INNER JOIN EmployeeLevel el1 ON e1.LevelId = el1.Id LEFT JOIN Employee e2 ON e1.ParentId = e2.Id LEFT JOIN EmployeeLevel el2 ON e2.LevelId = el2.Id;

Вот ответ

Проверьте, вот рабочая скрипка

0 голосов
/ 08 ноября 2019

Вот один из подходов:

  • Получить иерархию для сотрудника.
  • Используйте join s, чтобы получить информацию о желаемом флаге.
  • Используйте join s, чтобы вернуть всю необходимую информацию.

Как запрос:

with cte as (
      select e.id, e.parentid, 1 as lev
      from employee e
      where id = 4000
      union all
      select cte.id, e.parentid, lev + 1
      from cte join
           employee e
           on e.id = cte.parentid
     )
select e.*, el.*
from cte join
     employee e
     on cte.id = e.id join
     employee el
     on cte.parentid = el.id join
     EmployeeLevel eml
     on cte.parentid = eml.id;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...