Запит SQL для пошуку предка для кожного рядка

Є дві таблиці, один містить ієрархічні дані працівників,

Id, Name, ManagerId

     

1, Boss, NULL

     

2, ManagerA, 1

     

3, ManagerB, 1

     

4, LeadC, 2

     

5, EngineerD, 4

     

...

На другому столі входить керівник кожного відділу

Ідентифікатор відділу

     

2, розробка

     

3, продаж

     

4, ProjectX

Тепер я хочу створити вигляд, що базується на першій таблиці, але має ще одну стовпець "Департамент", визначений найближчим предком, що має запис у таблиці 2. Чи можливо використання одного SQL-вислову?

Id, Name, ManagerId, Department

     

1, Boss, NULL, NULL

     

2, ManagerA, 1, Розробка

     

3, ManagerB, 1, Sales

     

4, LeadC, 2, ProjectX

     

5, EngineerD, 4, ProjectX

1
@AmitSingh на "найближчого предка" я маю на увазі шукати батьківську ланцюжок рекурсивно.
додано Автор NS.X., джерело
@AmitSingh на "найближчого предка" я маю на увазі шукати батьківську ланцюжок рекурсивно.
додано Автор NS.X., джерело
Вибачте, але не можете зрозуміти, як ви вирішили предка ??
додано Автор Amit Singh, джерело
Вибачте, але не можете зрозуміти, як ви вирішили предка ??
додано Автор Amit Singh, джерело

6 Відповіді

рекурсивний загальний вираз таблиці переходить ієрархію

with ed as (
    select
        employee.id, employee.managerid, department.department
    from employee left join department on  employee.Id = department.Id 
    where department is not null
    union all 
    select
        employee.id, employee.managerid, department.department
    from employee 
    inner join ed on employee.managerid = ed.id
    inner join department on  ed.Id = department.Id 
)
select * From ed

answer adapted from http://blog.sqlauthority.com/2012/04/24/sql-server-introduction-to-hierarchical-query-using-a-recursive-cte-a-primer/

2
додано
Працює як чарівність! Дякую за відповідь і вказівник на CTE, який я обов'язково навчаюсь.
додано Автор NS.X., джерело

рекурсивний загальний вираз таблиці переходить ієрархію

with ed as (
    select
        employee.id, employee.managerid, department.department
    from employee left join department on  employee.Id = department.Id 
    where department is not null
    union all 
    select
        employee.id, employee.managerid, department.department
    from employee 
    inner join ed on employee.managerid = ed.id
    inner join department on  ed.Id = department.Id 
)
select * From ed

answer adapted from http://blog.sqlauthority.com/2012/04/24/sql-server-introduction-to-hierarchical-query-using-a-recursive-cte-a-primer/

2
додано
Працює як чарівність! Дякую за відповідь і вказівник на CTE, який я обов'язково навчаюсь.
додано Автор NS.X., джерело
select employeedata.id,name,managerId,
case when DepartmentName 
is null then (select departmentName from department where id =managerID )
else DepartmentName
end as dep2
from employeeData
left join 
department on employeeData.id=department.id

перегляд демо-версії sql

1
додано
select employeedata.id,name,managerId,
case when DepartmentName 
is null then (select departmentName from department where id =managerID )
else DepartmentName
end as dep2
from employeeData
left join 
department on employeeData.id=department.id

перегляд демо-версії sql

1
додано

Це буде робити:

SELECT e.*,
CASE h1.Department IS NULL h2.Department ELSE h1.Department END AS Department
from employee e
LEFT JOIN heads h1 ON e.id = h1.id
LEFT JOIN heads h2 ON e.ManagerId = h2.id
0
додано

Це буде робити:

SELECT e.*,
CASE h1.Department IS NULL h2.Department ELSE h1.Department END AS Department
from employee e
LEFT JOIN heads h1 ON e.id = h1.id
LEFT JOIN heads h2 ON e.ManagerId = h2.id
0
додано