And*_*dén 5 sql-server cte t-sql recursive
我有一张桌子 foo
与内容
所以表 foo 的记录可以用这个图形来表示。
当我运行一个应该使用@starting_id=9 返回祖先的过程时
(在图中用圆圈表示),我得到这个结果
代替
为什么?
CREATE PROCEDURE [dbo].[GetParents]
@starting_id int
AS
BEGIN
WITH chainIDsUpwards AS
(
SELECT id, parent_id FROM foo WHERE id = @starting_id
UNION ALL
SELECT foo.id, foo.parent_id FROM foo
JOIN chainIDsUpwards p ON p.id = foo.parent_id
)
SELECT id FROM chainIDsUpwards
END
Run Code Online (Sandbox Code Playgroud)
小提琴在https://dbfiddle.uk/?rdbms=sqlserver_2019&fiddle=81be3d86dc7581eb60bc7af4c09077e4
我相信您在连接谓词中犯了一个错误。尝试:
WITH chainIDsUpwards AS
(
SELECT id, parent_id FROM foo WHERE id = @starting_id
UNION ALL
SELECT foo.id, foo.parent_id FROM foo
JOIN chainIDsUpwards p ON p.parent_id = foo.id
)
SELECT id FROM chainIDsUpwards
Run Code Online (Sandbox Code Playgroud)
这是一个常见的错误,我自己也经常这样做。如果我从 CTE 开始,我发现最容易做到正确:
SELECT foo.id, foo.parent_id
FROM chainIDsUpwards p
JOIN foo p
Run Code Online (Sandbox Code Playgroud)
然后将 CTE 视为一个链表,我需要在其中找到下一个元素:
ON p.parent_id = foo.id
Run Code Online (Sandbox Code Playgroud)