【问题标题】:Flatten tree structure represented in SQL [duplicate]SQL中表示的扁平树结构[重复]
【发布时间】:2020-01-12 04:10:14
【问题描述】:

我正在使用工程计算包,并尝试在允许 SQL 查询的内置报告工具中从中提取一些信息

简略的示例 SQL 表如下:

Id |  Description  | Ref
---|---------------------
1  |  system 1     |        
3  |  block 4      | 6
3  |  block 4      | 1
5  |  formula1     | 3
6  |  f            | 
7  |  something    | 1
9  |  cheese       | 5

“Ref”列标识作为其他项目子记录的行。

我想要做的是运行一个查询,该查询将生成一个列表,该列表将显示每个页面上出现的所有项目。从上表可以看出,“ID”不是唯一键;每个项目都可以出现在表格中的多个位置。在上面的例子中:

  • ID 5 是 ID3 的子项
  • ID 3 是 ID 1 AND ID 6 的子项
  • ID 1 和 ID 6 不是任何东西的子项

它实际上代表了一个树结构:

ID 1
+-------- ID 7
    |---- ID 3
        +---- ID 5
            +---- ID 9
ID 6
+---- ID 3
    +---- ID 5
        +---- ID 9

我希望找出哪些项目出现在每个顶级项目下(因此最终结果应该是一个表格,其中“参考”列中只有顶级项目出现):

Id |  Description  | Ref
---|---------------------
1  |  system 1     |        
3  |  block 4      | 6
3  |  block 4      | 1
5  |  formula1     | 1
5  |  formula1     | 6
6  |  f            | 
9  |  cheese       | 1
9  |  cheese       | 6
7  |  something    | 1

树形结构一共可以有5层深度

我一直在尝试使用左连接来构建页面引用列表,但我认为我还需要合并结果表(因为显然像 ID=9、ID=5 和 ID 这样的行= 6 必须在最终结果集中重复)。开始有点乱了!

WITH   A
AS     (SELECT *
         FROM   [RbdBlocks]),
       B
AS     (SELECT [x].[Id],
               [x].[Description],
               [x].[Page] AS Page1,
               [y].[Page] AS Page2,
        FROM   A AS x
               LEFT OUTER JOIN
               A AS y
               ON y.Id = x.Page)
SELECT *
FROM   B

以上内容为我提供了一些嵌套引用,但我不确定是否有更好的方法来收集这些数据并管理递归,而不是仅仅将查询集复制 4 次?

【问题讨论】:

    标签: sql tsql hierarchical-data


    【解决方案1】:

    看看Recursive Common Table Expressions (CTE)。他们应该能够完全满足您的需求。

    查看 SQL 文档页面上的 Example D

    基本上你会在你的情况下做的是:

    • 在 CTE 的“锚定成员”中,选择所有顶级项
    • 在 CTE 的“递归成员”中,将所有嵌套的子项连接到顶级项

    递归 CTE 并不容易理解,因此请务必仔细阅读文档。

    【讨论】:

    • 是的 - 那些看起来确实像东西 - 似乎只是在工作,现在我遇到了我正在尝试查询的软件中的错误!
    猜你喜欢
    • 2021-04-04
    • 1970-01-01
    • 1970-01-01
    • 2021-01-01
    • 2021-05-06
    • 1970-01-01
    • 2021-08-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多