2016-07-08 31 views
1

在此先感谢您的帮助。我对MS SQL数据库还是比较陌生的,但是我想知道为什么我下面的MSSQL递归查询没有返回我期望的值。我已经完成了我的研究,最后是我提出的代码。比方说,我有以下表...递归查询SQL Server不按预期工作

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 
+0

'WHERE a.ParentID = 0'(第一个选项可能是更好的,如果要创建的某种根鉴于此第二个主要适用) ,'WHERE b.ParentID = d.theID' –

+0

我想最后的选择可能来自'RecursiveQuery'。 'd.theID'不会产生横切值'3',它将成为所有id的列表。所以filter = 3会给你一条记录。 –

+0

正如@IvanStarostin所说,你的锚定成员定义并不是记录。主播应该是一个作为你的出发点的记录。 –

回答

2

如果你想从具体根椐:

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 
+0

@debonaire你应该把它标记为答案,如果是的话。 –

+0

谢谢你现在要做。你可以批准编辑变量名称非常感谢 – debonaire

0

正如评论指出,锚不受限制。最简单的办法就是添加绕圈在锚

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 
+0

非常感谢你的建议。将考虑到这一点。干杯! – debonaire