2017-02-15 123 views
2

我有表,几列&我使用的是CTE在有序地分层,以获得数据:的SQL Server CTE查询没有得到期望的结果

Cat 1 
--item X1 
--item X2 
Cat 2 
Cat 3 
Cat 4 
cat 5 
--item A1 
--item A2 
Cat 6 

表数据:

ID LanguageID Name  ParentID Active 
---------------------------------------------- 
1 1   Cat 1  0   1 
2 1   item X1  1   1 
3 1   item X2  1   1 
4 1   cat 2  0   1 
5 1   cat 3  0   0 
6 1   cat 4  0   1 
7 1   cat 5  0   1 
8 1   item A1  7   1 
9 1   item A2  7   0 
10 1   cat 6  0   1 

CTE查询:

WITH CTE (ID, ParentID, Name, LanguageID, Active, Depth, SortCol) AS 
( 
    SELECT 
     ID, ParentID, Name, LanguageID, Active, 0, 
     CAST(ID AS varbinary(max)) 
    FROM 
     Project 
    WHERE 
     ParentID = 0 AND Active = 1 

    UNION ALL 

    SELECT 
     d.ID, d.ParentID, d.Name, p.LanguageID, p.Active, p.Depth + 1, 
     CAST(SortCol + CAST(d.ID AS binary(4)) AS varbinary(max)) 
    FROM 
     Project AS d 
    JOIN 
     CTE AS p ON d.ParentID = p.ID 
    WHERE 
     p.Active = 1 
) 
SELECT 
    ID, ParentID, Name, LanguageID, Active, Depth, 
    REPLICATE('  ', Depth) + Name as HName 
FROM 
    CTE 
WHERE 
    LanguageID = 1 AND Active = 1 
ORDER BY 
    Name 

上面的查询隐藏父类,但不是子项。

其次,我只能在名称中订购父类别,但不能订购子项目

预期的输出应该是:

Cat 1 
--item X1 
--item X2 
Cat 2 
Cat 4 
cat 5 
--item A1 
Cat 6 

更新:只是说我不显示在上面的输出CTE查询的所有列下面是查询的完整输出

ID ParentID Name  LanguageID Active Depth HName 
------------------------------------------------------------------ 
1  0  Cat 1   1   1  0 Cat 1 
4  1  item X1   1   1  0 item X1 
7  1  item X2   1   1  0 item X2 
8  0  cat 2   1   1  1 cat 2 
9  0  cat 4   1   1  1 cat 4 
10  0  cat 5   1   1  0 cat 5 
3  7  item A1   1   1  1 item A1 
2  7  item A2   1   1  1 item A2 
6  0  cat 6   1   1  0 cat 6 
+2

要过滤掉'项目A2'记录你需要使用'WHERE d.Active = 1',而不是'WHERE p.Active = 1' – cha

+0

谢谢,我知道我在做一些我无法看到的错误。感谢您指出。请把它是一个答案,以便我可以接受它 – Learning

回答

0

你可以在这里使用自己加入。看看下面的查询

select p.Name, c.Name,c.Active,c.Id,c.LanguageID 
From Project c left outer join Project p 
where c.ParentId = p.Id