2016-09-26 12 views
0

我想從下表中爲每一行獲取 部門名稱。 [image 1]需要在sql server的同一張桌面上加入的替代方案

Employee | Manager | Dept 
---------+---------+------------- 
Santosh | Gyan | 
Rahul |   | HR 
Suresh | Gyan | 
Gyan  |   | Technology 
  • 每個經理也是一個員工。
  • IF部門名稱不適用於一個公司員工,那麼我不得不尋找他的經理在員工列,並找到他的部

附件是預期的輸出。 [image 2]

Employee | Manager | Dept 
---------+---------+------------ 
Santosh | Gyan | Technology 
Rahul |   | HR 
Suresh | Gyan | Technology 
Gyan  |   | Technology 

試過右接合部在同一個表,它給出的結果,但花費太多時間在一個大桌子。所以請建議一種替代方法。

+0

組織的現實世界的深度不會在你的例子 – Eric

+0

是否很好地描述你的表是存儲員工和經理的員工姓名嗎?這是一個壞主意。嘗試爲每個員工創建一個具有整數數據類型的主鍵列,並用經理ID替換您的經理名稱。整數數據類型中的搜索和連接速度會更快,這也會使您的表格更加一致。即使您可以將部門保留在單獨的表格中,並將該ID映射到員工表格以保持表格正常化。 –

回答

1

您可以使用查詢,如:

SELECT 
    Employee, 
    Manager, 
    CASE WHEN Dept = '' THEN (
     SELECT t.Dept 
     FROM yourTable t 
     WHERE t.Employee = yourTable.Manager 
    ) 
    ELSE Dept 
    END As Dept 
FROM 
    yourTable; 

[SQL Fiddle Demo]

該查詢,就像你說的話一個SQL翻譯)。

1

爲了獲得查詢性能,您可以使用Union All代替。

SELECT EMPLOYEE, DEPT FROM EMPLOYEE WHERE DEPT IS NOT NULL 
    UNION ALL 
    SELECT E.EMPLOYEE, EM.DEPT FROM EMPLOYEE E 
    INNER JOIN EMPLOYEE EM ON E.MANAGER = EM.MANAGER 
    AND E.DEPT IS NULL 
0

試試這個,

SELECT e.Employee, e.Manager, ISNULL(e.Dept, em.Dept) 
FROM Employees e 
    LEFT JOIN Employees em ON em.Employee = e.Manager 
     AND e.Dept = '' 
1

試試這個:

SELECT e.Employee, e.Manager, COALESCE(e.Dept, e1.Dept) Dept 
FROM Employees e 
LEFT JOIN Employees e1 ON e1.Employee = e.Manager 

OR:

SELECT e.Employee, e.Manager, COALESCE(e.Dept, t.Dept) Dept 
FROM Employees e 
OUTER APPLY (SELECT dept FROM Employees e1 WHERE e1.employee = e.manager) t 
+0

如果你有一個給定結構的大表,可以在員工和經理列上創建一個索引,並嘗試@Suraz建議的上述方法。+ 1從我身邊.. :) –

1

也許左加入不同的名單上

Declare @YourTable table (Employee varchar(50),Manager varchar(50),Dept varchar(50)) 
Insert Into @YourTable values 
('Santosh','Gyan',''), 
('Rahul','','HR'), 
('Suresh','Gyan',''), 
('Gyan','','Technology') 

Select A.Employee 
     ,A.Manager 
     ,Dept = Isnull(B.Dept,A.Dept) 
From @YourTable A 
Left Join (Select Distinct Employee,Dept from @YourTable Where Dept<>'') B 
    on A.Manager=B.Employee 

甚至

Select A.Employee 
     ,A.Manager 
     ,Dept = case when A.Dept='' then B.Dept else A.Dept end 
From @YourTable A 
Outer Apply (Select Dept from @YourTable Where Employee=A.Manager) B 

返回

Employee Manager Dept 
Santosh  Gyan Technology 
Rahul    HR 
Suresh  Gyan Technology 
Gyan    Technology