我有一张桌子
与内容
所以表 foo 的记录可以用这张图来表示。
当我运行一个应该使用 @starting_id=9 返回祖先的过程时
(在图中用圆圈表示),我得到了这个结果
- 9
代替
- 9
- 3和
- 1
为什么?
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
小提琴https://dbfiddle.uk/?rdbms=sqlserver_2019&fiddle=81be3d86dc7581eb60bc7af4c09077e4
我相信你在你的连接谓词中犯了一个错误。尝试:
这是一个常见的错误,我经常自己做。如果我从 CTE 开始,我发现最容易做对:
然后将 CTE 视为一个链表,我需要在其中找到下一个元素:
我已经从其他人那里得到了建议。让我知道这是否正确展开。
现在很明显为什么
parent_id
并且id
应该互换。