在SQL Server中,我有這個簡單的表,我試圖讓所有的員工列表與他們的域管理器:最大遞歸100已經聲明完成前被耗盡(SQL Server)的
IF OBJECT_ID('tempdb.dbo.#employees') IS NOT NULL DROP TABLE #employees
CREATE TABLE #employees (
empid int,
empname varchar(50),
mgrid int,
func varchar(50)
)
INSERT INTO #employees VALUES(1, 'Jeff', 2, 'Designer')
INSERT INTO #employees VALUES(2, 'Luke', 4, 'Head of designers')
INSERT INTO #employees VALUES(3, 'Vera', 2, 'Designer')
INSERT INTO #employees VALUES(4, 'Peter', 5, 'Domain Manager')
INSERT INTO #employees VALUES(5, 'Olivia', NULL, 'CEO')
;
WITH Emp_CTE AS (
SELECT empid, empname, func, mgrid AS dommgr
FROM #employees
UNION ALL
SELECT e.empid, e.empname, e.func, e.mgrid AS dommgr
FROM #employees e
INNER JOIN Emp_CTE ecte ON ecte.empid = e.mgrid
WHERE ecte.func <> 'Domain Manager'
)
SELECT * FROM Emp_CTE
所以我想輸出是:
empid empname func dommgr
1 Jeff Designer 4
2 Luke Head of designers 4
3 Vera Designer 4
相反,我得到這個錯誤:
Msg 530, Level 16, State 1, Line 17 The statement terminated. The maximum recursion 100 has been exhausted before statement completion.
我在做什麼錯?是否可以用CTE
?
編輯:有的確是一個錯誤的數據,錯誤現在已經走了,但結果不是我想要的:
empid empname func dommgr
1 Jeff Designer 2
2 Luke Head of designers 4
3 Vera Designer 2
4 Peter Domain Manager 5
5 Olivia CEO NULL
4 Peter Domain Manager 5
1 Jeff Designer 2
3 Vera Designer 2
的可能的複製[最大遞歸100已經聲明完成前被耗盡(https://stackoverflow.com/questions/9650045/the-maximum-recursion-100-has-been-exhausted-before-語句完成) –
不是重複的,因爲這是邏輯錯誤。但我不明白這個邏輯。爲什麼'mgrid' /'dommgr'在所有結果記錄中都是4,但這些記錄在表中有不同的managerid?你能用文字解釋你想要達到的目標嗎?如果你在遞歸CTE中的根查詢將包含一個類似'WHERE mgrid IS NULL'的過濾器,那麼你將避免無限遞歸,但結果仍然不同。 –
域管理員的ID是'4',但沒有員工有4個作爲'mgrid',這就是爲什麼你沒有得到你期望的結果。沒有人管理員是'域管理器' –