2017-02-21 11 views
5

Wyciągam dane pracowników z bazy danych programu SQL Server w celu narysowania wykresu organizacyjnego. Moja firma ma wiele działów (jak sądzę każda firma). Chciałem tylko ciągnąć jeden konkretny dział na raz.Dynamicznie zmień węzeł nadzorcy na wartość null

W naszej bazie danych każdy szef działu również zgłasza się do dyrektora generalnego lub przewodniczącego. W jaki sposób mogę zmienić kolumnę reportsToEmpId (w czasie wykonywania) dla szefa działu na NULL? Jeśli rodzic szefa działu nie należy do tego działu.

Oto moja reportsTo struktura tabeli:

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

Odkąd tylko ciągnąć deptId = 1 i Jim nie jest dept1. Czy mogę dynamicznie zmieniać kolumnę John 'reportsToEmpId na NULL?

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

Próbowałem użyć tabeli tmp, ale wydaje się zbyt uciążliwe.

Original wyjściowa:

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

Oto mój oczekiwany wynik: (Jednak wolę nie dokonywać żadnych zmian na oryginalnym stole, gdyż w przeciwnym razie, jeśli chcę ciągnąć każdy, kto zgłosi się do dyrektora generalnego, a następnie I utracił "połączenie" między działami).

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

Więc co oczekują jako wyjście tutaj? I podałeś tylko trochę niejasne informacje dla jednej z trzech tabel w zapytaniu. –

+0

Cześć Sean, dziękuję. Zaktualizowałem moje pytanie. (Dodałem oczekiwany wynik do końca mojego pytania :-) –

Odpowiedz

1

Można lewo przyłączyć zarówno empId i deptId. Jeśli pracownik jest zgłaszane nie ma tej samej deptId, następnie reportsToEmpId będzie 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

Myślę, że to jest odpowiedź, ponieważ instrukcja FuzzyTree nie modyfikuje oryginalnej tabeli. (co nie załamie relacji między działami). –

2

Musisz użyć Self Inner Join do osiągnięcia tego celu

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 
Powiązane problemy