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)
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)