工作中点滴记录

永远保持学徒心态

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

在项目中遇到了一个层级关系,情况如下,要在用户信息表中找到汇报给大区销售经理的员工信息(含汇报给大区销售经理的员工的员工),

1 及:大区销售经理

2级:汇报给大区销售经理的直接汇报对象

3级:汇报给2级的直接对象;

为了以后方便查找此资料,现在我把大区销售经理的id 看成2,T-SQL语句如下:

T-SQL
1 With temp_1 AS(
2 SELECT ee.EmployeeID ,ee.LastName +' '+ee.FirstName as Name FROM Employees ee INNER JOIN Employees tt ON tt.EmployeeID = ee.ReportsTo
3 WHERE tt.EmployeeID = 2
4 ),
5 temp_2 AS(
6 SELECT EmployeeID,Name FROM temp_1
7 UNION
8 SELECT ee.EmployeeID,ee.LastName+' '+ee.FirstName as Name FROM Employees ee INNER JOIN temp_1 tt ON tt.EmployeeID = ee.ReportsTo
9 )

另一种方式是创建一个sql 的function

View Code
 1 CREATE FUNCTION dbo.FnGetReports(@EmpolyeeID    AS INT)
2 RETURNS @Reports TABLE
3 (
4 EmployeeID INT NOT NULL,
5 ReportToID INT NULL
6 )
7 AS
8 BEGIN
9 DECLARE @Employee INT;
10 INSERT INTO @Reports SELECT EmployeeID,ReportsTo FROM Employees WHERE EmployeeID=@EmpolyeeID;
11 SELECT @Employee=MIN(EmployeeID) FROM Employees WHERE ReportsTo=@EmpolyeeID;
12 WHILE @Employee IS NOT NULL
13 BEGIN
14 INSERT INTO @Reports SELECT * FROM dbo.FnGetReports(@Employee);
15 SELECT @Employee = MIN(EmployeeID)
16 FROM Employees
17 WHERE EmployeeID>@Employee
18 AND ReportsTo=@EmpolyeeID
19 END
20 RETURN
21 END
22 GO

调用方式:

1 DECLARE @EmployeeID    INT;
2 SELECT @EmployeeID = 2;
3 SELECT ee.EmployeeID,ee.LastName+' '+ ee.FirstName,tt.LastName+' '+TT.FirstName AS 'ReportTo'
4 FROM Employees AS ee
5 INNER JOIN DBO.FnGetReports(@EmployeeID) AS aa ON ee.EmployeeID = aa.EmployeeID
6 INNER JOIN Employees tt ON tt.EmployeeID = aa.ReportToID




posted on 2012-03-25 22:45  梦里故乡  阅读(832)  评论(0编辑  收藏  举报