自参考循环MSSQL
我有这张桌子自参考循环MSSQL,sql,sql-server,Sql,Sql Server,我有这张桌子 Parenttbl ID Name ParentID --------------------- 1 Mary Null 2 Jane 1 3 Jenny 2 4 Jessa 3 我想创建一个从子对象到父对象循环的查询。例如,如果我给4号id,它将从jessa向mary返回3,2,1,Null,直到它发现父id为Null。到目前为止,我有一个疑问: SELECT fc2.ID FROM Parenttbl as fc1
Parenttbl
ID Name ParentID
---------------------
1 Mary Null
2 Jane 1
3 Jenny 2
4 Jessa 3
我想创建一个从子对象到父对象循环的查询。例如,如果我给4号id,它将从jessa向mary返回3,2,1,Null,直到它发现父id为Null。到目前为止,我有一个疑问:
SELECT fc2.ID
FROM Parenttbl as fc1
LEFT JOIN Parenttbl as fc2
ON fc1.ParentID = fc2.ID
WHERE fc1.ID = 6
我计划使用while循环。我该怎么做?提前谢谢 可以与常用表表达式一起使用
WITH Hierarchy AS (
SELECT ID,ParentID
FROM People
WHERE ID = 4
UNION ALL
SELECT p.ID, p.ParentID
FROM People p
JOIN Hierarchy h ON h.ParentID = p.ID
)
SELECT ID FROM Hierarchy
使用递归查询。大概是这样的:
WITH ParentOf (parentid, name, id, parentlevel)
AS
(
-- Anchor query
SELECT parentid, name, id, 1 as parentLevel
FROM parenttbl
WHERE parenttbl.id = 4
UNION ALL
-- Recursive query
SELECT p.parentid, p.name, p.id, parentlevel +1
FROM parenttbl p
INNER JOIN ParentOf
ON p.Id = ParentOf.parentid
)
-- Statement that executes the CTE
SELECT ParentId, name, id, parentlevel
FROM ParentOf;
最简单的解决方案是在任何类型的循环或游标方法上使用递归CTE
with cte as
(
select * from parenttbl
where id = 4
union all
select p.* from parenttbl p
inner join cte c on p.id <= c.parentid
)
select id, name, parentid from cte
group by id, name, parentid
你还没问过问题。你刚才说了一些意图。@mason对不起,先生,我编辑了我的问题。我建议你看看使用CTE的递归查询:你说的我怎么做是什么意思?你知道怎么写while循环,对吧?试着真正实现你想要的。