2013-06-04 115 views
0

我有兩個表格:EmployeeMasterEmployeeDetails。兩者的模式是如下:在兩個表中 enter image description here生成員工層次結構

樣本數據示:

enter image description here

enter image description here

我要生成使用EmployeeDetails表主要的層次結構。該表包含名爲:Manager的列。經理的EmployeeId需要從表EmployeeMaster表中挑選。

這是如何形成層次結構。 EmployeeId作爲參數傳遞給存儲過程。需要挑選該員工的兩名主管,需要挑選該員工以下的10名員工。

例如,我將Josh.Berkus的EmployeeId傳遞給存儲過程。存儲過程查詢應返回的層次結構如下:

enter image description here

我想在這個格式的最終​​輸出:

EMPLOYEE_ID .... MANAGER_ID

-------- --- .... ------------

請注意,Manager_Id是Manager的EmployeeId。

我嘗試使用聯合所有查詢的CTE,但無法正確獲取它。

回答

2

其實你需要制定出遞歸性,因爲對經理可以有一個經理...
看看:

事情是,你需要2個查詢......一個去「上」的層次結構和一個去...然後結合結果...

爲什麼你不合並兩張桌子,因爲一個人不能有兩個經理對嗎?!?特別是因爲一位經理也是一名員工......這將簡化一切......

+0

或者,我想創建一個臨時表並從兩個表中填寫記錄。在這種情況下,查詢將如何工作? – RKh

+0

@RKh我說你的存儲過程將不得不運行2個查詢:一個上去,另一個下來,然後你可以UNION結果...檢查我的答案中的新鏈接... – Leonardo

+0

我試過CTE,但它didn工作不正常。你是對的,需要兩個查詢來填寫第三個表格。有關如何讓10名僱員低於所選員工的想法? – RKh

1

可以使用CROSS JOIN創建所有記錄之間的鏈接,然後就可以把條件選擇只讓他們之間的經理和僱員關係的那些列。

代碼應該是這樣的:

SELECT 
    ed.employeeid 'Employee ID', 
    em.employeeid 'Manager ID', 
FROM EMPLOYEEMASTER em CROSS JOIN EMPLOYEEDETAILS ed 
WHERE ed.manager = em.username 
+0

這個我做了,但我不能挑選上面的僱員和十名下面的三名以上的上級。 – RKh

+0

然後,您將不得不再次加入表格9以獲得此級別的層次結構。 –

+0

不好實現,雖然... – Leonardo

1

您需要在這裏實現一些遞歸以獲得完整的層次結構。

這是一個快速和骯髒的例子,你如何能夠實現這個獲得經理層次結構。你也需要類似的更低級別的東西

create function dbo.GetManagerHierarchy 
( 
@EmpID int 
) 
returns varchar(100) 
as 
begin 
declare @result varchar(100) 
declare @managerId int 

SET @managerId = (select top 1 Manager from EmployeeDetails where EMployeeId) 
if @managerId is not null then 
    SET @result = dbo.GetManagerHierarchy(@managerID) + '-' + CONVERT(varchar(100), @managerId) + 
else 
    SET @result = '' 

return @result 

end