【问题标题】:How to flatten parent-child hierarchy from bottom up using CTE如何使用 CTE 自下而上展平父子层次结构
【发布时间】:2020-01-06 12:27:10
【问题描述】:

对于堆栈溢出的第一个问题,我有以下问题,我有一个如下所示的层次结构表:

Table TEST

 - [wbe_node_type] [varchar](50) NOT NULL,  /* leaf or expanded */
 - [wbe_node] [varchar](50) NOT NULL,
 - [wbe_node_mask] [varchar](50) NOT NULL,
 - [wbe_description] [varchar](50) NOT NULL,
 - [wbe_parent] [varchar](50) NOT NULL,    
 - [wbe_node_niveau] [int] NOT NULL,        /* level of the record in the hierarchy */

数据如下:

wbe_node_type, wbe_node, wbe_node_mask, wbe_omschrijving, wbe_parent, wbe_node_niveau

expanded, AFCARN0, A-FCARN0, Project 1, [NULL]. 0
leaf, AFCARN04010, A-FCARN0.40.10, Description 2, AFCARN040, 2
expanded, AFCARN040, A-FCARN0.40, Realisatie, AFCARN0, 1

wbe_node_type 'leaf' 的行是层次结构中的最低层,最大深度为 8 层。我想要的是从底层(“叶”节点)到顶层的一行中扁平化层次结构。

我的想法是开始查找 wbe_node_type = 'leaf' 的所有记录并找到它上面的所有级别。使用临时表很容易做到这一点。但是,我用来查询这些数据的工具不适用于临时表。所以我想用 CTE 试试。

当我在网上寻找示例时,这些示例总是从顶部开始,然后逐渐向下。是否可以从最低级别开始从底部填充 CTE?

【问题讨论】:

  • 我不太确定你的问题 - 你不能写一些带有连接的查询来使你的层次结构扁平化吗?你目前有什么 CTE - 它有什么问题?
  • 嗨,理查德,感谢您的评论。我已尝试改进问题描述。
  • wbe_parent 字段是对 wbe_node 字段的引用吗?
  • 嗨,罗斯,是的。
  • 父记录可以有多个孩子吗?

标签: sql sql-server common-table-expression hierarchy


【解决方案1】:

对此不是 100% 确定,但可能是这样的。

  SELECT 
*
 FROM TEST l3 
 Inner JOIN TEST l2 ON l3.wbe_parent = l2.wbe_node
 Inner JOIN TEST l1 ON l2.wbe_parent = l1.wbe_node
 WHERE 
l3.wbe_node = 'AFCARN04010'

似乎有效

【讨论】:

  • 因为一个父项可能有多个子记录,所以这个查询可能会生成多行,而不是要求的单行。
  • 你去。更新了答案
  • 您可能需要根据使用 wbe_node_niveau 字段的级别来编辑代码和内部联接
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-03-08
  • 2022-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-25
  • 1970-01-01
相关资源
最近更新 更多