无法找到祖先的 CTE 查询

And*_*dén 5 sql-server cte t-sql recursive

我有一张桌子 foo

桌子

与内容

在此处输入图片说明

所以表 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
Run Code Online (Sandbox Code Playgroud)

小提琴在https://dbfiddle.uk/?rdbms=sqlserver_2019&fiddle=81be3d86dc7581eb60bc7af4c09077e4

Len*_*art 6

我相信您在连接谓词中犯了一个错误。尝试:

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)