我正在使用以下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