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(涂聚文)
  • 相关阅读:
    反序列化二叉树-队列
    二叉树中和为某一值的路径
    深拷贝复杂链表
    机器人运动范围
    vue 安装及使用
    json 函数
    js 获取当前时间
    JS编码方式
    搭建自己的Webpack项目
    webpack 安装 打包
  • 原文地址:https://www.cnblogs.com/geovindu/p/15308706.html
Copyright © 2011-2022 走看看