展平SQL分层数据

时间:2020-06-04 12:47:11

标签: sql sql-server sql-server-2016 hierarchical-data

是否可以在不知道根的情况下展平如下所示的分层数据?

我正在考虑使用以下内容首先找到最终的父母 然后使用递归层次结构cte查找子节点

选择父项,COUNT(*) 来自test_le 父母!=孩子 按父母分组

但是我再次想知道是否有可能直接这样做

输入

parent,child,parent_catg,child_catg
A   A   FIN FIN
A   B   FIN FIN
B   B   FIN FIN
A   C   FIN FIN
B   C   FIN FIN
C   C   FIN FIN
B   D   FIN FIN
C   D   FIN FIN
E   E   OTH OTH
E   F   OTH OTH
A   G   FIN FIN
B   G   FIN FIN
A   H   FIN FIN
P   P   FIN FIN
P   Q   FIN FIN

所需的输出

ultimate_parent child_nodes
A   B,C,D,G,H
E   F
P   Q

预先感谢

1 个答案:

答案 0 :(得分:1)

在SQL Server中,使用CTE(公用表表达式)几乎是“如何直接访问它”。我加载了您的数据并尝试进行处理(下面的测试代码),但是很快遇到了数据方面的许多问题...

  • 具有“自我识别”行(A,A)(B,B)等使事情变得更加复杂
  • 因为没有全部(没有(D,D)

也许更相关(我不确定技术术语),但这不是常规的层次结构。 D是B和C的孩子;并且B是A的孩子,而C是B和A的孩子。因此,“常规”遍历层次结构的方法将不适用。

以下是我为解决该问题而进行的编码尝试,但鉴于所提供数据的性质,它无法正常工作。

--CREATE TABLE #MyTable
-- (
--   Parent       char(1)  not null
--  ,Child        char(1)  not null
--  ,Parent_catg  char(3)  not null
--  ,Dhild_catg   char(3)  not null
-- )

--INSERT #MyTable values
--  ('A', 'A', 'FIN', 'FIN')
-- ,('A', 'B', 'FIN', 'FIN')
-- ,('B', 'B', 'FIN', 'FIN')
-- ,('A', 'C', 'FIN', 'FIN')
-- ,('B', 'C', 'FIN', 'FIN')
-- ,('C', 'C', 'FIN', 'FIN')
-- ,('B', 'D', 'FIN', 'FIN')
-- ,('C', 'D', 'FIN', 'FIN')
-- ,('E', 'E', 'OTH', 'OTH')
-- ,('E', 'F', 'OTH', 'OTH')
-- ,('A', 'G', 'FIN', 'FIN')
-- ,('B', 'G', 'FIN', 'FIN')
-- ,('A', 'H', 'FIN', 'FIN')
-- ,('P', 'P', 'FIN', 'FIN')
-- ,('P', 'Q', 'FIN', 'FIN')

;WITH cte
 as (

    select
       Parent
      ,Child
     from #MyTable
     where Child <> Parent
      and  Parent not in(select Child from #MyTable where Parent <> Child)

    union all select
       mt.Parent
      ,mt.Child
    from cte
     inner join #MyTable  mt
      on mt.Child = cte.Parent
    where mt.Child <> mt.Parent
     and cte.Child <> cte.Parent
    )

--select *
-- from cte
-- where Child <> Parent
-- order by Parent, Child

select
   Parent
  ,string_agg(Child, ',')
 from cte
 where Child <> Parent
 group by
   Parent
相关问题