2013-06-04 5 views
0

У меня есть две таблицы: EmployeeMaster и EmployeeDetails. Схема обоих, как показано ниже: enter image description hereСоздать иерархию сотрудников

Образец данных в обеих таблицах показано:

enter image description here

enter image description here

Я хочу создать иерархию с помощью EmployeeDetails таблицы в первую очередь. В этой таблице содержится столбец с именем: «Менеджер». EmployeeId Диспетчера необходимо выбрать из таблицы EmployeeMaster.

Вот как должна быть сформирована иерархия. EmployeeId передается как параметр хранимой процедуры. Необходимо подобрать двух надзирателей этого Сотрудника и выбрать 10 сотрудников ниже этого сотрудника в старшинстве.

Например, я передаю EmployeeId из Josh.Berkus в хранимую процедуру. Хранимая процедура запрос должен возвращать иерархии, как показано ниже:

enter image description here

Я хочу, чтобы конечный результат в следующем формате:

EMPLOYEE_ID .... Manager_Id

-------- --- .... ------------

Обратите внимание: Manager_Id является EmployeeId of Manager.

Я попытался использовать CTE с объединением всего запроса, но не смог получить его правильно.

ответ

2

На самом деле вам нужно будет отработать рекурсивность так как на менеджера может иметь менеджер ...
взглянуть на:

Дело в том, что вам понадобится 2 вопроса ... один, чтобы идти «вверх» по иерархии, а один - вниз ... и затем объединяйте результаты ...

Почему бы вам не объединить две таблицы, так как у одного человека нет двух менеджеров??? Специально потому, что менеджер также является сотрудником ... это упростит все ...

+0

В качестве альтернативы, я собираюсь создать единую временную таблицу и заполнять записи из обеих таблиц. В этом случае, как будет работать запрос? – RKh

+0

@RKh, как я уже сказал, ваша хранимая процедура должна будет запускать 2 запроса: один для подъема и другой вниз, а затем вы можете СОЕДИНИТЬ результаты ... проверить новую ссылку в моем ответе ... – Leonardo

+0

Я пробовал CTE, но это didn работайте правильно. Вы правы, для заполнения третьей таблицы необходимы два запроса. Любая идея о том, как получить 10 сотрудников ниже выбранного сотрудника? – RKh

1

Вы можете использовать CROSS JOIN, чтобы создать связь между всеми вашими записями, а затем вы можете поставить условие, чтобы выбрать только те столбцы, которые имеют менеджер-работник отношения между ними.

Код должен быть что-то вроде этого:

SELECT 
    ed.employeeid 'Employee ID', 
    em.employeeid 'Manager ID', 
FROM EMPLOYEEMASTER em CROSS JOIN EMPLOYEEDETAILS ed 
WHERE ed.manager = em.username 
+0

Это я сделал, но я не смог выбрать двух начальников над сотрудником и десяти юниоров внизу. – RKh

+0

Тогда вам придется присоединяться к таблицам еще 9 раз, чтобы получить этот уровень иерархии. –

+0

плохая реализация, хотя ... – Leonardo

1

Чтобы получить полную иерархию, вам нужно реализовать некоторую рекурсию.

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

create function dbo.GetManagerHierarchy 
( 
@EmpID int 
) 
returns varchar(100) 
as 
begin 
declare @result varchar(100) 
declare @managerId int 

SET @managerId = (select top 1 Manager from EmployeeDetails where EMployeeId) 
if @managerId is not null then 
    SET @result = dbo.GetManagerHierarchy(@managerID) + '-' + CONVERT(varchar(100), @managerId) + 
else 
    SET @result = '' 

return @result 

end 
Смежные вопросы