2017-02-21 3 views
5

Я извлекаю данные сотрудника из базы данных SQL Server, чтобы нарисовать орг-диаграмму. У моей компании много отделов (я думаю, что каждая компания делает). Я только хотел вытащить один конкретный отдел за раз.Динамически изменить узел супервизора на нуль

В нашей базе данных каждый начальник отдела также отчитывается перед генеральным директором или председателем. Как я могу изменить колонку reportsToEmpId (во время выполнения) для главы отдела до NULL? Если родитель главы отдела не входит в этот отдел.

Вот моя reportsTo структура таблицы:

empId, name, reportsToEmpId, deptId 
100, John, 99, 1 
101, Mary, 100, 1 
102, Carol, 100, 1 
99, Jim, null, 2 

Так как я только тянуть deptId = 1 и Jim не dept1. Могу ли я динамически изменять John в колонке reportsToEmpId до NULL?

select fields I need 
from reportsTo r 
join employee e on r.empId = e.empId 
join groupHightlight h on ... 
where deptId=1 

Я попытался использовать таблицу tmp, но это кажется слишком громоздким.

Оригинальный выход:

empId, name, reportsToEmpId, deptId 
    100, John, 99, 1 
    101, Mary, 100, 1 
    102, Carol, 100, 1 

Вот мой ожидаемый результат: (Тем не менее, я предпочитаю не делать какие-либо изменения на исходной таблице, так как в противном случае, если я хочу, чтобы вытащить всех, кто отчитывается CEO, то я потеряли «связь» между отделами).

empId, name, reportsToEmpId, deptId 
    100, John, NULL, 1 
    101, Mary, 100, 1 
    102, Carol, 100, 1 
+0

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

+0

Привет, Шон, спасибо. Я обновил свой вопрос. (Я добавил ожидаемый вывод в нижней части моего вопроса :-) –

ответ

1

Вы можете присоединиться оставили на обоих empId и deptId. Если работник сообщается в не один и тот же deptId, то reportsToEmpId будет null:

select r.empId, r.name, r2.empId reportsToEmpId, r.deptId 
from reportsTo r 
left join reportsTo r2 
    on r2.empId = r.reportsToEmpId and r.deptId = r2.deptId 
where r.deptId=1 
+1

Я думаю, что это ответ, так как выражение FuzzyTree не изменяет исходную таблицу. (что не нарушит отношения между отделами). –

2

Вы должны использовать Self Inner Join для достижения этой цели

UPDATE T1 
SET T1.reportsToEmpId = NULL 
FROM reportsTo T1 INNER JOIN reportsTo T2 
    ON T1.reportsToEmpid = T2.empId 
WHERE T1.deptid <> T2.deptId AND T1.deptID = 1