Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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
Sql server 递归查询SQL Server未按预期工作_Sql Server_Recursion_Recursive Query - Fatal编程技术网

Sql server 递归查询SQL Server未按预期工作

Sql server 递归查询SQL Server未按预期工作,sql-server,recursion,recursive-query,Sql Server,Recursion,Recursive Query,提前谢谢你的帮助。我对MSSQLSDB还是很陌生,但我想知道为什么下面对MSSQL的递归查询没有返回我期望的值。我已经做了我的研究,在底部是我提出的代码。假设我有下表 CategoryID ParentID SomeName 1 0 hmm 2 0 err 3 0 woo 4 3 ppp 5

提前谢谢你的帮助。我对MSSQLSDB还是很陌生,但我想知道为什么下面对MSSQL的递归查询没有返回我期望的值。我已经做了我的研究,在底部是我提出的代码。假设我有下表

CategoryID    ParentID    SomeName
1             0           hmm
2             0           err
3             0           woo
4             3           ppp
5             4           ttt
我希望下面的查询返回3 4 5。我基本上是想根据我在递归查询中传递的类别id,在其下方获得类别id的继承权列表。谢谢你的帮助

GO
WITH RecursiveQuery (CategoryID)
AS
(
-- Anchor member definition
    SELECT a.CategoryID 
    FROM [SomeDB].[dbo].[SomeTable] AS a
    WHERE a.ParentID = CategoryID 
    UNION ALL
-- Recursive member definition
    SELECT b.CategoryID
    FROM [SomeDB].[dbo].[SomeTable] AS b
    INNER JOIN RecursiveQuery AS d
        ON d.CategoryID = b.ParentID
)
-- Statement that executes the CTE
SELECT o.CategoryID
FROM [SomeDB].[dbo].[SomeTable] AS o
INNER JOIN RecursiveQuery AS d
    ON d.CategoryID = 3
GO

如果要从特定根目录创建树,请执行以下操作:

DECLARE @rootCatID int = 3

;WITH LessonsTree (CatID)
AS
(
    SELECT a.CategoryID
    FROM [EducationDatabase].[dbo].[LessonCategory] AS a
    WHERE a.CategoryID = @rootCatID ---<<<

    UNION ALL

    SELECT b.CategoryID
    FROM LessonsTree as t
    INNER JOIN [EducationDatabase].[dbo].[LessonCategory] AS b
        ON b.ParentID = t.CatID
)
SELECT o.*
FROM LessonsTree t
INNER JOIN [EducationDatabase].[dbo].[LessonCategory] AS o
    ON o.CategoryID = t.CatID

如果要从特定根目录创建树,请执行以下操作:

DECLARE @rootCatID int = 3

;WITH LessonsTree (CatID)
AS
(
    SELECT a.CategoryID
    FROM [EducationDatabase].[dbo].[LessonCategory] AS a
    WHERE a.CategoryID = @rootCatID ---<<<

    UNION ALL

    SELECT b.CategoryID
    FROM LessonsTree as t
    INNER JOIN [EducationDatabase].[dbo].[LessonCategory] AS b
        ON b.ParentID = t.CatID
)
SELECT o.*
FROM LessonsTree t
INNER JOIN [EducationDatabase].[dbo].[LessonCategory] AS o
    ON o.CategoryID = t.CatID

如评论中所述,主播不受限制。最简单的解决方案是在锚中添加准则

with RecursiveQuery (theID)
AS
(
    SELECT a.ParentID --root id=parentid to include it and to prevent an extra trip to LessonCategory afterwards
    FROM  [LessonCategory] AS a
    WHERE a.ParentID = 3 --restriction here
    UNION ALL
    SELECT b.CategoryID
    FROM [LessonCategory] AS b
    INNER JOIN RecursiveQuery AS d
        ON d.theID = b.ParentID
)
SELECT* from RecursiveQuery
另一种选择是让递归查询是通用的,不受限制的锚,并让它保留rootid。然后cte上的查询可以限制rootid。第一个选项可能更好,第二个选项主要适用于创建某种根视图的情况

with RecursiveQuery 
AS
(
    SELECT a.ParentID theID, a.ParentID RootID
    FROM  [LessonCategory] AS a    
    UNION ALL
    SELECT b.CategoryID, d.RootID
    FROM [LessonCategory] AS b
    INNER JOIN RecursiveQuery AS d
        ON d.theID = b.ParentID
)
SELECT theID from RecursiveQuery where RootID = 3

如评论中所述,主播不受限制。最简单的解决方案是在锚中添加准则

with RecursiveQuery (theID)
AS
(
    SELECT a.ParentID --root id=parentid to include it and to prevent an extra trip to LessonCategory afterwards
    FROM  [LessonCategory] AS a
    WHERE a.ParentID = 3 --restriction here
    UNION ALL
    SELECT b.CategoryID
    FROM [LessonCategory] AS b
    INNER JOIN RecursiveQuery AS d
        ON d.theID = b.ParentID
)
SELECT* from RecursiveQuery
另一种选择是让递归查询是通用的,不受限制的锚,并让它保留rootid。然后cte上的查询可以限制rootid。第一个选项可能更好,第二个选项主要适用于创建某种根视图的情况

with RecursiveQuery 
AS
(
    SELECT a.ParentID theID, a.ParentID RootID
    FROM  [LessonCategory] AS a    
    UNION ALL
    SELECT b.CategoryID, d.RootID
    FROM [LessonCategory] AS b
    INNER JOIN RecursiveQuery AS d
        ON d.theID = b.ParentID
)
SELECT theID from RecursiveQuery where RootID = 3

其中a.ParentID=0,其中b.ParentID=d.thei,我猜最终的选择可能来自递归查询。d、 ID不会产生横切值3,它将是所有ID的列表。所以filter=3将给您一条记录。正如@IvanStarostin所说,您的锚定成员定义没有锚定到记录。锚点应该是一条作为起点的记录。好的,谢谢,我认为锚点是终止条件好的,我的错误将尝试一下…其中a.ParentID=0,其中b.ParentID=d。我猜最终选择可能来自递归查询。d、 ID不会产生横切值3,它将是所有ID的列表。所以filter=3将给您一条记录。正如@IvanStarostin所说,您的锚定成员定义没有锚定到记录。锚应该是一条记录,作为你的起点。好的,谢谢我认为锚是终止条件好的,我的错误会尝试一下…@debonaire如果是,你应该把它标记为答案。谢谢,现在就可以了。你能批准对变量名的编辑吗much@debonaire如果答案是,你应该把它标记为答案。谢谢,现在就可以了。你能批准变量名的编辑吗非常感谢你的建议。我会考虑到这一点。干杯非常感谢你的建议。我会考虑到这一点。干杯