2017-02-15 173 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