2010-01-04 75 views
1

我有簡單的查詢CTE SQL查詢得到完整路徑

WITH conn_cte (ParentCategoryId, CategoryId, IdsPath) 
     AS (SELECT ParentCategoryId 
        ,CategoryId 
        ,CAST(ParentCategoryId AS varchar(1000)) 
      FROM Ind_CategoriesConnections 
      WHERE ParentCategoryId = 0 
      UNION ALL 
      SELECT cc.ParentCategoryId 
        ,cc.CategoryId 
        ,CAST(IdsPath + ',' 
        + CAST (cc.ParentCategoryId AS varchar(5)) AS varchar(1000)) 
      FROM Ind_CategoriesConnections AS cc 
        INNER JOIN conn_cte AS conn ON conn.CategoryId = cc.ParentCategoryId 
                AND cc.categoryid NOT IN (
                SELECT conn.Categoryid) 
      ) 
    SELECT x.* 
    FROM (SELECT t.ParentCategoryId 
        ,t.CategoryId 
        ,t.IdsPath + ',' + CAST(t.CategoryId AS varchar(5)) AS [path] 
      FROM conn_cte t 
        INNER JOIN Ind_Categories c ON t.CategoryId = c.CategoryId 
                AND c.CategoryViewId = 1 
                AND c.IsActiveYN = 1 
     ) x 
    ORDER BY x.path 

我在查詢(最佳),有趣的是,只有從根返回完整路徑葉。

例如結果的部分是

Parent Child Path 
12  16  0,8,12,16 
16  17  0,8,12,16,17 
17  18  0,8,12,16,17,18 
17  19  0,8,12,16,17,19 

零爲根18,19葉子(和孩子),我想忽略像0,8,12,160,8,12,16,17部分路徑,並獲得唯一的全路徑(與葉子結束) 0,8,12,16,17,180,8,12,16,17,19

回答

1

你可以這樣說:

WHERE NOT EXISTS (SELECT * FROM conn_cte AS parents WHERE t.path LIKE parents.path + '%') 
+0

但請記住,如果你有0,8,12,16,17,183 - 這可能會讓你四處奔波。您可能希望更早地使用逗號,以便您的路徑看起來像'0,8,12,16,17,18,' – 2010-01-04 23:15:05

2
DECLARE @tbl TABLE 
    ( 
    Id int 
    ,ParentId int 
) 

INSERT INTO @tbl 
     (Id, ParentId) 
VALUES (0, NULL) 
,  (8, 0) 
,  (12, 8) 
,  (16, 12) 
,  (17, 16) 
,  (18, 17) 
,  (19, 17) 

; 
WITH abcd 
     AS (
       -- anchor 
      SELECT id 
        ,ParentID 
        ,CAST(id AS VARCHAR(100)) AS [Path] 
      FROM @tbl 
      WHERE ParentId IS NULL 
      UNION ALL 
       --recursive member 
      SELECT t.id 
        ,t.ParentID 
        ,CAST(a.[Path] + ',' + CAST(t.ID AS VARCHAR(100)) AS varchar(100)) AS [Path] 
      FROM @tbl AS t 
        JOIN abcd AS a ON t.ParentId = a.id 
      ) 
SELECT Id ,ParentID ,[Path] 
FROM abcd 
WHERE Id NOT IN (SELECT ParentId 
        FROM @tbl 
        WHERE ParentId IS NOT NULL) 

返回

Id   ParentID Path 
----------- ----------- ---------------------- 
18   17   0,8,12,16,17,18 
19   17   0,8,12,16,17,19 



語法是SQL Server 2008中,2005年的變化INSERT INTO @tbl ...語法。