Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
自参考循环MSSQL_Sql_Sql Server - Fatal编程技术网

自参考循环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循环,对吧?试着真正实现你想要的。