[英]Flatten sql hierarchical data
是否可以在不知道根的情況下展平如下所示的分層數據?
我正在考慮使用下面的方法首先找到最終的父節點,然后使用遞歸層次結構 cte 來查找子節點
select parent,COUNT(*) from test_le where parent!=child group by parent
但我又想知道是否可以直接做
輸入
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
所需 Output
ultimate_parent child_nodes
A B,C,D,G,H
E F
P Q
提前致謝
在 SQL 服務器中,使用 CTE(公用表表達式)幾乎就是“如何直接訪問它”。 我加載了您的數據並嘗試處理一個(下面的測試代碼),但很快就遇到了您的數據的一些問題......
也許更相關(我不確定技術術語),但這不是傳統的層次結構。 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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.