2

Stackoverflowメンバーの皆様

次のような再帰CTEクエリがあります。

DECLARE @Level TABLE (ID int, ParentID int, Name varchar(max))

INSERT INTO @Level (ID, ParentID, Name)
         VALUES (1,0, 'AAAA'),
                (2,1, 'BBBB'),
                (3,2, 'CCCC'),
                (4,3, 'DDDD'),
                (5,4, 'EEEE')

;WITH cte (ID, ParentID, Name, Path, Level) AS
(
     SELECT 
         ID, ParentID, Name, CONVERT(varchar(MAX), Name), 1
     FROM 
         @Level
     WHERE 
         ParentID = 0

     UNION ALL

     SELECT 
         n.ID, n.ParentID, n.Name, 
         CONVERT(varchar(MAX), cte.Path + '/' + n.Name), cte.Level + 1
     FROM 
         @Level n
     JOIN 
         cte on n.ParentID = cte.ID
   )
   SELECT * FROM cte  

上記のクエリの結果:

ID          ParentID    Name    Path                         Level
----------- ----------- ------- ---------------------------- -----------
1           0           AAAA    AAAA                         1
2           1           BBBB    AAAA/BBBB                    2
3           2           CCCC    AAAA/BBBB/CCCC               3
4           3           DDDD    AAAA/BBBB/CCCC/DDDD          4
5           4           EEEE    AAAA/BBBB/CCCC/DDDD/EEEE     5

CTEクエリからの必要な出力:

ID          ParentID    Name   Paths                        Path                         Level
----------- ----------- ----------------------------------- ---------------------------- -----------
1           0           AAAA   AAAA                         AAAA                         1
2           1           BBBB   AAAA/BBBB                    AAAA/BBBB                    2
3           2           CCCC   AAAA/.../CCCC                AAAA/BBBB/CCCC               3
4           3           DDDD   AAAA/.../.../DDDD            AAAA/BBBB/CCCC/DDDD          4
5           4           EEEE   AAAA/.../.../.../EEEE        AAAA/BBBB/CCCC/DDDD/EEEE     5

上記の例からわかるように、パスは非常に長くなる可能性があり、パスをドットに置き換える必要があります。開始文字と終了文字が表示されたままで、中央のコンテンツのみが置き換えられることを除いて。VALUESの内容は、例として使用されているものであれば何でもかまいません。

ありがとう

4

1 に答える 1

3

これは、ルートと現在を除くすべてを折りたたむ

   DECLARE @Level TABLE (ID int, ParentID int, Name varchar(max))

        INSERT INTO @Level (ID, ParentID, Name)
         VALUES (1,0, 'AAAA'),
                (2,1, 'BBBB'),
                (3,2, 'CCCC'),
                (4,3, 'DDDD'),
                (5,4, 'EEEE')


        ;WITH cte (ID, ParentID, Name, Root, Path, Level) AS
   (
   SELECT ID, ParentID, Name, CONVERT(varchar(MAX), Name),
          CONVERT(varchar(MAX), Name), 1
   FROM @Level
   WHERE ParentID = 0
   UNION ALL
   SELECT n.ID, n.ParentID, n.Name, cte.Root, cte.Root + '/' +
          CASE WHEN cte.Level=1 then ''
               else replicate('.../', cte.level-1) end +
          n.Name, cte.Level + 1
   FROM @Level n
   JOIN cte on n.ParentID = cte.ID
   )
   SELECT * FROM cte  
于 2012-11-15T14:29:31.373 に答える