zoukankan      html  css  js  c++  java
  • sql server: Parent/Child hierarchy tree view

    sql server - Parent/Child hierarchy tree view - Stack Overflow

    ---
    declare @pc table(CHILD_ID int, PARENT_ID int, [NAME] varchar(80));
     
    insert into @pc
    select 1,NULL,'Bill' union all
    select 2,1,'Jane' union all
    select 3,1,'Steve' union all
    select 4,2,'Ben' union all
    select 5,3,'Andrew' union all
    select 6,NULL,'Tom' union all
    select 7,8,'Dick' union all
    select 8,6,'Harry' union all
    select 9,3,'Stu' union all
    select 10,7,'Joe';
     
     
    ; with r as (
          select CHILD_ID, PARENT_ID, [NAME], depth=0, sort=cast(CHILD_ID as varchar(max))
          from @pc
          where PARENT_ID is null
          union all
          select pc.CHILD_ID, pc.PARENT_ID, pc.[NAME], depth=r.depth+1, sort=r.sort+cast(pc.CHILD_ID as varchar(30))
          from r
          inner join @pc pc on r.CHILD_ID=pc.PARENT_ID
          where r.depth<32767
    )
    select tree=replicate('-',r.depth*3)+r.[NAME]
    from r
    order by sort
    option(maxrecursion 32767);
    GO
    
    
    
    --https://www.sqlteam.com/articles/more-trees-hierarchies-in-sql
    
    
    SELECT a.ID, a.CategoryName, COALESCE(b.CategoryName,'-') AS 'ParentName'
    FROM Category AS a LEFT JOIN Category AS b on a.ParentID = b.ID
    GO
    
    
    create table pc ( parent varchar(10), child varchar(10) )
    
    insert into pc values('a','b');
    insert into pc values('a','c');
    insert into pc values('b','e');
    insert into pc values('b','f');
    insert into pc values('a','d');
    Insert into pc values('b','g');
    insert into pc values('c','h');
    insert into pc values('c','i');
    insert into pc values('d','j');
    insert into pc values('f','k');
    insert into pc values('x','y');
    insert into pc values('y','z');
    insert into pc values('m','n');
    
     DECLARE @parent varchar(10) = 'a';
     WITH cte AS
     (
      select null parent, @parent child, 0 as level
       union
      SELECT  a.parent, a.child , 1 as level
        FROM pc a
       WHERE a.parent = @parent
       UNION ALL
      SELECT a.parent, a.child , c.level +    1
      FROM pc a JOIN cte c ON a.parent = c.child
      )
      SELECT distinct parent, child , level
      FROM cte
      order by level, parent
      go
    
      -- https://stackoverflow.com/questions/9676637/sql-parent-child-tree-with-sort-order
      -- https://stackoverflow.com/questions/49903446/sql-parent-child-tree-data-return-only-completed-tree-nodes-from-list
      -- https://www.sqlteam.com/articles/more-trees-hierarchies-in-sql
      declare @relations table(ParentID int, ChildID int, SortOrder int, treeID int);
    
    insert into @relations values
    (0,1,0,0), (1,2,1,0), (2,3,2,0), (2,4,1,0), (2,6,3,0), (1,7,2,0), (1,9,3,0), (9,10,1,0), (9,12,2,0) --tree 0
    , (0,1,0,1), (1,2,1,1), (2,3,2,1), (2,4,1,1), (2,6,3,1), (1,7,2,1), (1,9,3,1), (9,10,1,1), (9,12,2,1) --tree 1
    
    ; with cte(ParentId,ChildId,SortOrder,depth,agg,treeID) as (
        select null,ParentId,SortOrder,0
        , right('0000000'+CAST(treeID as varchar(max)),7)
            +right('0000000'+CAST(SortOrder as varchar(max)),7)
        , treeID
        from @relations where ParentId=0
        union all
        select cte.ChildId,r.ChildId,r.SortOrder,cte.depth+1
        , cte.agg
            +right('0000000'+CAST(r.treeID as varchar(max)),7)
            +right('0000000'+CAST(r.SortOrder as varchar(max)),7)
            +right('0000000'+CAST(r.ChildId as varchar(max)),7)
        , r.treeID
        from cte
        inner join @relations r on r.ParentID=cte.ChildId
        where cte.depth<32767
        and r.treeID=cte.treeID
    )
    select
    tree=case depth when 1 then cast(ParentID as varchar(30))+' (sort '+cast(SortOrder as varchar(30))+')'
        else REPLICATE(CHAR(9),depth-1)
            + cast(ChildId as varchar(30))+' (sort '+cast(SortOrder as varchar(30))+')'
        end
    from cte
    where depth>0
    order by agg
    option (maxrecursion 32767);
    go
    
    
    ---顺序排列Geovin Du PageSet,CategoryIsDisplay,CategoryPojectId
    
    WITH cte AS
    (
      SELECT 
        ID, 
        [ParentID],
        CategoryName,
    	PageSet,
        IdOrder,
        CAST(0 AS varbinary(max)) AS Level
      FROM Category
      WHERE [ParentID] is null and CategoryIsDisplay=1 and CategoryPojectId=1
      UNION ALL
      SELECT 
        i.ID, 
        i.[ParentID],
        i.CategoryName,
    	i.PageSet,
        i.IdOrder,  
        Level + CAST(i.ID AS varbinary(max)) AS Level
      FROM Category i
      INNER JOIN cte c
        ON c.ID = i.[ParentID]
    )
    SELECT 
      ID, 
      [ParentID],
      CategoryName,
      PageSet,
      IdOrder
    FROM cte
    ORDER BY [Level];
    go
    

      

    WITH cte AS
    (
      SELECT 
        ID, 
        [ParentID],
        CategoryName,
    	PageSet,
        IdOrder,
    	dbo.f_getlevel(ID) AS Dulv,
        CAST(0 AS varbinary(max)) AS Level	
      FROM Category
      WHERE [ParentID] is null and CategoryIsDisplay=1 and CategoryPojectId=1
      UNION ALL
      SELECT 
        i.ID, 
        i.[ParentID],
        i.CategoryName,
    	i.PageSet,
        i.IdOrder, 
    	dbo.f_getlevel(i.ID) AS Dulv,
        Level + CAST(i.ID AS varbinary(max)) AS Level	
      FROM Category i
      INNER JOIN cte c
        ON c.ID = i.[ParentID]
    )
    SELECT 
      ID, 
      [ParentID],
      CategoryName,
      PageSet,
      IdOrder,
      Dulv
    FROM cte
    ORDER BY [Level];
    go
    
    --
    WITH cte AS
    (
      SELECT 
        ID, 
        [ParentID],
        CategoryName,
    	PageSet,
        IdOrder,
        dbo.f_getlevel(ID) AS Level
      FROM Category
      WHERE [ParentID] is null and CategoryIsDisplay=1 and CategoryPojectId=1
      UNION ALL
      SELECT 
        i.ID, 
        i.[ParentID],
        i.CategoryName,
    	i.PageSet,
        i.IdOrder,  
        dbo.f_getlevel(i.ID) AS Level
      FROM Category i
      INNER JOIN cte c
        ON c.ID = i.[ParentID]
    )
    SELECT 
      ID, 
      [ParentID],
      CategoryName,
      PageSet,
      IdOrder,
      Level
    FROM cte
    ORDER BY Level;
    go
    

      

    哲学管理(学)人生, 文学艺术生活, 自动(计算机学)物理(学)工作, 生物(学)化学逆境, 历史(学)测绘(学)时间, 经济(学)数学金钱(理财), 心理(学)医学情绪, 诗词美容情感, 美学建筑(学)家园, 解构建构(分析)整合学习, 智商情商(IQ、EQ)运筹(学)成功.---Geovin Du(涂聚文)
  • 相关阅读:
    python--第十天总结(Select/Poll/Epoll使用 )
    python--第九天总结
    数据库文件*.sdf文件定时备份,但是大小的增量在不断增长的问题排查
    打开和创建SqlCe(.sdf文件)
    C# 在RichTextBox中滚动鼠标时滚动的是父窗口的滚动条
    Foxmail 7.0破解版,拷贝到新机器后,发送邮件乱码问题
    C# RichTextBox设置行间距
    winform在鼠标操作时要判断是否按下Ctrl键
    vs2015 制作安装包额外需要安装的软件VSI_bundle
    vs 2015工具栏添加Tab Order
  • 原文地址:https://www.cnblogs.com/geovindu/p/15308706.html
Copyright © 2011-2022 走看看