2017-02-21 45 views
5

olarak değiştirin. Bir org çizelgesi çizmek için çalışan verilerini bir SQL Server veritabanından alıyorum. Şirketimin birçok departmanı var (bence her şirket var). Sadece belirli bir departmanı bir seferde çekmek istedim.Denetim amortisörü nodunu

Veritabanımızda, her departman müdürü de CEO veya başkanlığa rapor verir .. Bir bölüm başkanı için NULL için reportsToEmpId sütununu (çalışma zamanında) nasıl değiştirebilirim? Bölüm başkanının ebeveyni bu bölüme ait değilse. Sadece deptId = 1 çekin ve Jimdept1 olmadığından

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

:

İşte benim Raporlar tablo yapıdır. JohnreportsToEmpId sütununu NULL olarak dinamik olarak değiştirebilir miyim?

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

Tmp tablosunu kullanmayı denedim ancak çok hantal görünüyor.

Orijinal çıkışı: Burada

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

benim beklenen çıkışı: (CEO'ya rapor veren herkesi çekmek istiyorum Ancak, ben, çünkü aksi takdirde, orijinal masada herhangi bir değişikliğe gerek duyulmaması sonra tercih Bölümler arasında "bağlantı" kaybetti).

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

? Ve sadece sorgunuzdaki üç tablodan biri için belirsiz bir bilgi verdiniz. –

+0

Merhaba Sean, teşekkürler. Sorumu güncelledim. (Bu soruya cevabımı :-) –

cevap

1

Sen empId ve deptId hem katılmak sola edebilirsiniz ulaşmak için Self Inner Join kullanmak zorunda. Çalışan aynı deptId yok olduğu rapor ediliyor, o zaman reportsToEmpIdnull olacaktır:

Yani burada çıktı olarak ne bekliyoruz
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

altına ekledim. FuzzyTree ifadesinin orijinal tabloyu değiştirmediği için bunun cevabı olduğunu düşünüyorum. (bölümler arasındaki ilişkiyi bozmayacak). –

2

Bu

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