SQL-запрос, чтобы найти всех начальников конкретного подчиненного - PullRequest
1 голос
/ 15 декабря 2011

Моя таблица содержит 3 столбца

Emp_ID |  Emp_Name   |  Emp_Manager_ID
========================================
1      |  Admin      |   Null         
2      |  John       |   1            
3      |  Sam        |   2             
4      |  Mike       |   2            
5      |  Jeff       |   4            
6      |  Ben        |   3            
7      |  Vicky      |   5

Параметр id @Emp_ID = 7 Ожидаемый результат для нахождения всех старших по заданному Emp_Id, поэтому результатом должны быть все EmpIDы 6,5,4,3,2,1, поскольку 5 - менеджер 7, а 4 - менеджер 5 и 2 - менеджер 4,3, 3 - менеджер 6, 1 - менеджер 2.

Ответы [ 3 ]

3 голосов
/ 15 декабря 2011

Это работает на дереве, и в вашем случае дает 7 -> 5 -> 4 -> 2 -> 1 и затем останавливается.

WITH
  unrolled_branch AS
(
  SELECT
    emp_id,
    emp_name,
    emp_mnager_id
  FROM
    yourTable
  WHERE
    emp_id = @emp_id

  UNION ALL

  SELECT
    your_table.emp_id,
    your_table.emp_name,
    your_table.emp_mnager_id
  FROM
    yourTable
  INNER JOIN
    unrolled_branch
      ON unrolled_branch.emp_manager_id = yourTable.emp_id
)
SELECT
  *
FROM
  unrolled_branch

Я застрял на том, как вы получаете 3 и 6, хотя.Вы просто имеете в виду, что они того же уровня, что и другие?

У вас есть это дерево ...

1-2-3-6
   \
    4-5-7

Но какими должны быть результаты в этом дереве?

      A-B-C
     /
1-2-3-6
   \
    4-5-7

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

    3   9     5-6     7       C     C
   / \ /         \   /       / \   / \
1-2   6-8         3-4       A   D-A   D- (etc, etc)
   \ /           /   \       \ /   \ /
    4-5-7     1-2     8       B     B
0 голосов
/ 15 декабря 2011

Вам потребуется настроить рекурсивный CTE для обхода вашего иерархического дерева.Посмотрите, например, http://www.4guysfromrolla.com/webtech/071906-1.shtml

0 голосов
/ 15 декабря 2011

Вот полный пример:

create table #employees (
Emp_ID int,
Emp_Name varchar(10),
Emp_Manager_ID int
)


create table #superiors (
Emp_ID int
)

insert into #employees values (1, 'Admin', NULL)
insert into #employees values (2, 'John', 1)
insert into #employees values (3, 'Sam', 2)
insert into #employees values (4, 'Mike', 2)
insert into #employees values (5, 'Jeff', 4)
insert into #employees values (6, 'Ben', 3)
insert into #employees values (7, 'Vicky', 5)

declare @count int, @testID int
select @testID = 7

select @count = NULL
select @count = Emp_Manager_ID from #employees where Emp_ID = @testID

while(@count IS NOT NULL)
begin
  insert into #superiors values (@count)
  select @count = Emp_Manager_ID from #employees where Emp_ID = @count
end



select * from #superiors


drop table #employees
drop table #superiors 
...