使用子查询从多个表中获取数据

时间:2011-07-17 08:31:50

标签: sql

我有两张桌子

表:员工

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

表:EMPMAP

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

在第二张表中,它显示emp 4低于1,而4低于5,再次6低于1

我想取得在特定员工下工作的员工。例如,如果我将empid 1传递给查询,我需要员工4和5的详细信息,如果我想要4,则需要5的详细信息。

有谁能告诉我如何为此编写查询?

3 个答案:

答案 0 :(得分:1)

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

答案 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

答案 2 :(得分:0)

首先,我想您想说,如果您通过emp_id 1,您需要员工4和6(不是4和5)的详细信息。 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