如何使用TSQL进行递归连接以获得最低级别的数据

Rud*_*cht 3 sql t-sql sql-server

我有以下数据集:

ID          ParentID 
----------- ---------
8320        NULL     
8321        8320     
8322        8320     
8323        8322     
8325        NULL     
8328        8325     
8329        8328 
Run Code Online (Sandbox Code Playgroud)

我想要实现的是选择属于特定ID的所有行.例如,如果我查询ID = 8320,则必须返回以下数据:

ID          ParentID 
----------- ---------
8320        NULL     
8321        8320     
8322        8320     
8323        8322
Run Code Online (Sandbox Code Playgroud)

到目前为止,这是我尝试过的,没有取得真正的成功.

select *
from JobQueueLog JQL
    left join JobQueueLog JQLC on
        JQL.ID = JQLC.ParentID
    and JQLC.ParentID is not null
where JQL.ID = 8320
Run Code Online (Sandbox Code Playgroud)

有什么帮助吗?

小智 5

您需要使用 CTE 并进行递归查询

with tmp (id, parentid) as (
select id, parentid
from rec
where id = 8320
union all
select rec.id, rec.parentid
from tmp
inner join rec on tmp.id = rec.parentid
)
select id, parentid
from tmp
Run Code Online (Sandbox Code Playgroud)


Pரத*_*ீப் 5

Recursive CTE's 意图是这样做的

WITH data
     AS (SELECT *
         FROM   ( VALUES ('8320',NULL),
                         ('8321','8320'),
                         ('8322','8320'),
                         ('8323','8322'),
                         ('8325',NULL),
                         ('8328','8325'),
                         ('8329','8328')) tc ([ID], [ParentID])),
     rec_cte
     AS (SELECT [ID],
                [ParentID]
         FROM   data
         WHERE  [ID] = '8320'
         UNION ALL
         SELECT r.[ID],
                r.[ParentID]
         FROM   rec_cte rc
                JOIN data r
                  ON r.[ParentID] = rc.ID)
SELECT [ID],
       [ParentID]
FROM   rec_cte 
Run Code Online (Sandbox Code Playgroud)

结果:

???????????????????
?  ID  ? ParentID ?
???????????????????
? 8320 ? NULL     ?
? 8321 ? 8320     ?
? 8322 ? 8320     ?
? 8323 ? 8322     ?
???????????????????
Run Code Online (Sandbox Code Playgroud)