2011-07-17 67 views
0

我有兩個表取數據子查詢

TABLE:EMPLOYEE

EMP_ID EMP_NAME EMP_TYPE 
1 Shwetha   1 
2 Raj    1 
3 Mani    1 
4 Sita    2 
5 Rani    3 
6 Guna    2 

TABLE:EMPMAP

MAP_ID (PK) EMP_ID EMPMAP_ID 
1    1 4 
2    4 5 
3    1 6 

在第二表它顯示EMP 4是下1,和4是在5和6再次爲下1

我想取誰是下一個具體工作的員工員工。舉例來說,我希望員工的詳細信息4和5,如果我通過EMPID 1到查詢和5的細節,如果我想爲4

誰能告訴我怎麼能寫這樣的查詢?

+0

你的意思是「5是在4」? – gbn

回答

1
select e.* 
from EMPMAP map 
join EMPLOYEE e on e.EMP_ID = map.EMPMAP_ID 
where map.EMP_ID = @empId 
+0

@marc_s,你說得對。什麼? –

+0

對不起,我認爲要求是讓所有的下屬,所有級別 - 但這不是原來的問題.... –

+0

@marc_s,+1給你的答案:-) –

0

第一,我想你想的話,你希望員工4和6的細節(NOT 4和5)如果你通過EMP_ID 1. 和SQL這是:

 
SELECT E.EMP_NAME, E.EMP_TYPE 
FROM EMPLOYEE E INNER JOIN EMPMAP EM ON E.EMP_ID = EM.EMPMAP_ID 
WHERE EM.EMP_ID = 1 
1

如果您使用的是SQL Server 2005或更新的版本,或者任何其他支持遞歸CTE(公用表表達式)的數據庫,則可以編寫一個遞歸CTE,如果您需要給定員工下的所有級別的下級(而不僅僅是直接下一級向下下屬):

DECLARE @StartEmpID INT = 1 

;WITH EmployeeHierarchy AS 
(
    SELECT 
     e.EmpID, e.EmpName, e.EmpType, 0 AS 'Level', NULL AS 'Supervisor ID' 
    FROM dbo.Employee e 
    WHERE e.EmpID = @StartEmpID 

    UNION ALL 

    SELECT 
     e.EmpID, e.EmpName, e.EmpType, Level + 1 AS 'Level', map.emp_id 
    FROM dbo.Employee e 
    INNER JOIN dbo.EmpMap map ON e.EmpID = map.empmap_id 
    INNER JOIN EmployeeHierarchy eh ON map.emp_id = eh.EmpID 
) 
SELECT * 
FROM EmployeeHierarchy 

這將產生所有員工由@StartEmpID定義的一個向下的遞歸上市 - 在幾個層次。

在你的情況,你會得到一個輸出是這樣的:

EmpID EmpName EmpType Level Supervisor ID 
1  Shwetha  1  0  NULL 
4  Sita   2  1   1 
6  Guna   2  1   1 
5  Rani   3  2   4