2017-02-21 19 views
5

Tôi đang kéo dữ liệu nhân viên từ cơ sở dữ liệu SQL Server để vẽ biểu đồ tổ chức. Công ty của tôi có nhiều phòng ban (tôi nghĩ mọi công ty đều làm). Tôi chỉ muốn kéo một bộ phận cụ thể tại một thời điểm.Tự động thay đổi nút giám sát thành null

Trên cơ sở dữ liệu của chúng tôi, mọi trưởng phòng cũng báo cáo với CEO hoặc ghế .. Làm cách nào để thay đổi cột reportsToEmpId (tại thời gian chạy) cho đầu bộ phận thành NULL? Nếu phụ huynh của trưởng phòng không thuộc về bộ phận này.

Đây là reportsTo cấu trúc bảng của tôi:

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

Vì tôi chỉ kéo deptId = 1, và Jim không phải là dept1. Tôi có thể tự động thay đổi cột của reportsToEmpId thành NULL không?

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

Tôi đã cố gắng sử dụng bảng tmp nhưng có vẻ quá cồng kềnh.

gốc đầu ra:

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

Dưới đây là kết quả mong muốn của tôi: (Tuy nhiên, tôi không muốn thực hiện bất kỳ thay đổi trên bảng ban đầu, vì nếu không thì nếu tôi muốn kéo tất cả mọi người báo cáo cho Giám đốc điều hành, sau đó tôi mất "kết nối" giữa các phòng ban).

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

Vì vậy, những gì đang mong đợi như đầu ra ở đây? Và bạn chỉ cung cấp một chút thông tin mơ hồ cho một trong ba bảng trong truy vấn của bạn. –

+0

Xin chào Sean, cảm ơn. Tôi đã cập nhật câu hỏi của mình. (Tôi đã thêm đầu ra dự kiến ​​vào cuối câu hỏi của mình :-) –

Trả lời

1

Bạn có thể để lại tham gia vào cả hai empIddeptId. Nếu người lao động được báo cáo không có cùng deptId, sau đó reportsToEmpId sẽ 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

Tôi nghĩ đây là câu trả lời, vì câu lệnh của FuzzyTree không sửa đổi bảng gốc. (mà sẽ không phá vỡ mối quan hệ giữa các phòng ban). –

2

Bạn phải sử dụng một Self Inner Join để đạt được điều này

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 
Các vấn đề liên quan