我正在使用以下CTE来获取经理和员工的层次结构,我有一个员工的多个经理,在这种情况下,我不希望CTE
重复为该员工一次又一次因为它是做在我的代码 - getemp()
是一个简单的函数返回employeeid, name and managerID
如何避免递归CTE重复定位值
;With hierarchy as
(
select [Level]=1 , * from dbo.getemp() where managerid = 1
union all
select [Level]+1 , e.* from getemp() e
join hierarchy h on h.employeeid = e.managerid
)
Select * from hierarchy
编辑后 - 以下办法为我工作。 CTE有可能吗?
SET NOCOUNT ON;
DECLARE @Rows int
SELECT [Level] = ISNULL(1,0),
employeeid = ISNULL(employeeid, 0),
empname = CAST(empname as varchar(10)),
managerid = ISNULL(managerid,0)
into #Temp1
from dbo.getemp() as a1
where a1.managerid = @Top1
--select * from #Temp1
SELECT @[email protected]@ROWCOUNT
DECLARE @I INT = 2;
while @Rows > 0
BEGIN
Insert into #Temp1
select @I as Level, b.employeeid, b.empname, b.managerid from #Temp1 as e
inner join (select [employeeid], [empname], [managerid] from dbo.GetEmp()) as b on b.managerid = e.employeeid
where e.Level = @I - 1
and not exists (
SELECT 1 FROM #Temp1 t
WHERE b.employeeid = t.employeeid
AND b.managerid = t.managerid);
SELECT @[email protected]@ROWCOUNT
--SELECT @Rows AS Rows
IF @Rows > 0
BEGIN
SELECT @I = @I + 1;
END
END
select distinct * from #Temp1
END
如果员工有几个管理人员,其中之一应在经理ID被退回? –
@JamesZ如果员工有两个经理,那么它应该返回两个managerID的行。但是对于下一次递归,它应该只考虑员工一次而不是两次。 – vishakha
示例数据和预期结果将会有所帮助。 CTE的一个问题是,递归查询无法访问除最近添加的行之外的其他任何内容。如果你需要访问先前处理过的行的所有_all_,那么你可能需要使用'WHILE'循环并将结果组装到一个临时表中,直到“@@ ROWCOUNT = 0”。 – HABO