【发布时间】: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