0

我有一个 SQL Server 2008 R2 UDF,它执行一种递归循环。我的意思是,我有一个名为Employees 的表,其中在我的一个列中存储了另一个Employee id(他的老板)。

当我得到一个员工ID时,我必须能够知道他下面的整个部门。例如:员工 Joe (ID:1) 为 Robert (ID:2) 工作 员工 Robert (ID:2) 为 Michelle (ID:3) 工作

我必须能够数出 Michelle 以下的所有员工(即 Robert 和 Joe)的薪水(假设是在同一张桌子上)。

到目前为止,我创建了一个 UDF,它返回一个包含 Michelle 以下所有员工 ID 的表,并在查询的 where 上使用 EXISTS 子句,但它的性能很差。

大家还有什么想法吗?

谢谢!

4

1 回答 1

1

您可能应该使用递归CTE而不是WHILE循环来查找所有员工。我没有你的表格或数据,所以我做了一些:

create table Employees (
    ID int not null primary key,
    Name varchar(20) not null,
    BigBossID int null foreign key references Employees(ID),
    Salary decimal(18,4) not null
)
go
insert into Employees (ID,Name,BigBossID,Salary) values
(1,'Joe',2,2.50),
(2,'Robert',3,19000.75),
(3,'Michelle',null,1234567890.00)

然后我可以使用这个查询来查找 Michelle 下面的所有员工:

declare @RootID int
set @RootID = 3
;With EmployeesBelowRoot as (
    select ID from Employees where BigBossID = @RootID
    union all
    select e.ID from Employees e inner join EmployeesBelowRoot ebr on e.BigBossID = ebr.ID
)
select SUM(Salary) from Employees where ID in (select ID from EmployeesBelowRoot)

您可以(如果您认为值得)将 CTE ( EmployeesBelowRoot) 放入 UDF 中并将其@RootID作为参数调用,但我现在只是将其直接放在查询中。

于 2013-08-30T07:01:32.820 回答