首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何获取Server自引用表中的嵌套数据3级

如何获取Server自引用表中的嵌套数据3级
EN

Stack Overflow用户
提问于 2014-03-09 01:30:26
回答 2查看 296关注 0票数 0
代码语言:javascript
运行
复制
ID  ParentID    Name
1   NULL        Adobe     
2   1           Adobe Flash
3   2           Adobe Flash 1
4   3           Adobe Flash 2
5   4           Adobe Flash 3
6   NULL        Visual Studio
7   6           Visual Studio Beginners
8   NULL        SQL Server
9   6           Visual Studio Intermediate
10  6           Visual Studio Advanced

我想编写一个嵌套4个层次的查询,以显示结果集:

代码语言:javascript
运行
复制
1.      Adobe
1.1     Adobe Flash
1.1.1   Adobe Flash 2
1.1.1.1 Adobe FLash 3
2.      Visual Studio
2.1     Visual Studio Beginners
3.      SQL Server
2.2     Visual Studio Intermediate
2.3     Visual Studio Advanced

任何帮助都是非常感谢的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-03-09 03:40:56

解决方案前的一些注意事项:

  1. 假设Server的最新版本。
  2. 这并不停留在3层深度,但如果有必要,您可以很容易地加以限制。
  3. 这可能是对数据库的异常使用--在大纲样式编号列表中放置层次结构几乎可以肯定地说,在表示层中做得更好。(执行初始层次结构的第一位非常标准)。
  4. 如果你的名单很大的话,我不知道这会有多大。
  5. 我使用表值构造函数将初始数据集填充到CTE中,没有任何原因。我本来可以建造一张桌子,临时庙宇,桌子变量一样容易。
  6. 一个人可能可以在几个步骤中做到这一点,但我必须更多地考虑它。

这就是我想出来的:

代码语言:javascript
运行
复制
WITH tbl AS (
 SELECT * 
   FROM (VALUES (1,NULL,'Adobe')     
               ,(2,1,'Adobe Flash')
               ,(3,2,'Adobe Flash 1')
               ,(4,3,'Adobe Flash 2')
               ,(5,4,'Adobe Flash 3')
               ,(6,NULL,'Visual Studio')
               ,(7,6,'Visual Studio Beginners')
               ,(8,NULL,'SQL Server')
               ,(9,6,'Visual Studio Intermediate')
               ,(10,6,'Visual Studio Advanced')) a(ID,ParentID,Name)
)
, initial AS (
  SELECT ID
        ,ParentID
        ,Name
            ,CONVERT(VARCHAR(MAX),ISNULL(ID,0)) as Path
        ,CAST('' AS VARCHAR(MAX)) AS PathGroup
    FROM tbl
   WHERE ParentID IS NULL
   UNION ALL
  SELECT tbl.ID
        ,tbl.ParentID
        ,tbl.Name
          ,initial.Path + '.' + CONVERT(VARCHAR(MAX),tbl.ID) 
        ,initial.Path 
    FROM tbl
         INNER JOIN 
         initial ON tbl.ParentId = initial.ID
)
, middle AS (
  SELECT *
        ,ROW_NUMBER() OVER(PARTITION BY PathGroup ORDER BY Path) rn
    FROM initial
)
, final AS (
  SELECT ID
        ,ParentID
        ,Name
            ,CONVERT(VARCHAR(MAX),rn) Hierarchy
    FROM middle
   WHERE ParentID IS NULL
   UNION ALL
  SELECT middle.ID
        ,middle.ParentID
        ,middle.Name
          ,final.Hierarchy + '.' + CONVERT(VARCHAR(MAX),middle.rn) 
    FROM middle
         INNER JOIN 
         final ON middle.ParentId = final.ID
)
SELECT Hierarchy
      ,Name 
  FROM final  
 ORDER BY Hierarchy
票数 2
EN

Stack Overflow用户

发布于 2014-03-09 04:23:53

代码语言:javascript
运行
复制
WITH SelfReferencingTable AS
(   SELECT  *
    FROM    (   VALUES
                (01, NULL   , 'Adobe'                       ),
                (02, 01     , 'Adobe Flash'                 ),
                (03, 02     , 'Adobe Flash 1'               ),
                (04, 03     , 'Adobe Flash 2'               ),
                (05, 04     , 'Adobe Flash 3'               ),
                (06, NULL   , 'Visual Studio'               ),
                (07, 06     , 'Visual Studio Beginners'     ),
                (08, NULL   , 'SQL Server'                  ),
                (09, 06     , 'Visual Studio Intermediate'  ),
                (10, 06     , 'Visual Studio Advanced'      )
            )   SRT(ID, ParentID, Name)
),
Levels AS
(   SELECT  SRT.Id, SRT.ParentId, SRT.Name, 
            0 as Level, -- To control maximum recurrence
            -- Concatenate row number order by Id (try with name)
            CAST(ROW_NUMBER() 
                OVER (ORDER BY SRT.ID) AS VARCHAR(MAX)) + '.' AS Path
    FROM    SelfReferencingTable SRT
    WHERE   ParentId IS NULL
    UNION ALL   -- Do the recursion, baby
    SELECT  SRT.Id, SRT.ParentId, SRT.Name, Level + 1, Levels.Path + 
            CAST(ROW_NUMBER() OVER (ORDER BY SRT.ID) AS VARCHAR) + '.'
    FROM    Levels
    JOIN    SelfReferencingTable SRT
        ON  SRT.ParentID = Levels.ID
)
SELECT      Path, Name
FROM        Levels
--WHERE     Level < 3   -- If you really need to limit maximum recursion
ORDER BY    Path

结果

代码语言:javascript
运行
复制
Path        Name
----------- ---------------------
1.          Adobe
1.1.        Adobe Flash
1.1.1.      Adobe Flash 1
1.1.1.1.    Adobe Flash 2
1.1.1.1.1.  Adobe Flash 3
2.          Visual Studio
2.1.        Visual Studio Beginners
2.2.        Visual Studio Intermediate
2.3.        Visual Studio Advanced
3.          SQL Server
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22277323

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档