【发布时间】:2019-09-03 09:01:03
【问题描述】:
我想创建一个显示另一个 SQL Server 表的层次结构的表。 我有一个具有以下结构的表
+-----------+----------+
| AccountID | ParentID |
+-----------+----------+
| 1 | |
+-----------+----------+
| 2 | 1 |
+-----------+----------+
| 3 | 1 |
+-----------+----------+
| 4 | 2 |
+-----------+----------+
| 5 | 3 |
+-----------+----------+
| 6 | 5 |
+-----------+----------+
并希望获得另一个具有以下结构的表
+-----------+------+
| AccountID | Path |
+-----------+------+
| 1 | 1 |
+-----------+------+
| 2 | 1 |
+-----------+------+
| 2 | 2 |
+-----------+------+
| 3 | 1 |
+-----------+------+
| 3 | 3 |
+-----------+------+
| 4 | 1 |
+-----------+------+
| 4 | 2 |
+-----------+------+
| 4 | 4 |
+-----------+------+
| 5 | 1 |
+-----------+------+
| 5 | 3 |
+-----------+------+
| 5 | 5 |
+-----------+------+
| 6 | 1 |
+-----------+------+
| 6 | 3 |
+-----------+------+
| 6 | 5 |
+-----------+------+
| 6 | 6 |
+-----------+------+
注意:在父母 ID 字段中,您必须始终包含您自己的 ID,即 1-1、2-2 等。
如果您在第一个表中看到,对于 AccountID 1,没有 ParentID,因为它是最高层级。但是在我需要提取的表中,您会看到 AccountID 1 的值 1 出现在 Path 列中。其余的值也是如此,也就是说,对于 AccountID 2,在结果表中 AccountID 1 出现(它的上级层次值),但它也必须包含值 2。所以对于其余的AccountID 列中的值。
设置示例数据:
create table Account
(
AccountID INT,
ParentID INT NULL
)
INSERT INTO Account(AccountID, ParentID)
VALUES
(1, NULL),
(2,1),
(3,1),
(4,2),
(5,3),
(6,5)
我无法得到这个结果。你能帮帮我吗?
提前致谢
【问题讨论】:
-
到目前为止你尝试过什么?你看过 rCTE 吗? SO上有很多这样的东西;为什么这些例子对你没有帮助?
-
只是为了澄清@Larnu 的评论,rCTE 是一个递归公用表表达式。它可能会帮助您缩小搜索范围;)但是,CTE 在处理分层数据时非常有效。
-
我查看了几篇使用递归 CTE 的帖子,但我不知道如何使用它。
-
我不确定您所说的“在父母 ID 字段中,您必须始终包含您自己的 ID,即 1-1、2-2”,因为这与您的示例不匹配,请解释路径应该如何派生。
-
@SteveFord,例如,结果表必须包含 AccountID 1、ParentID 1 字段。对于 AccountID 2,它必须同时包含 ParentID 1 和 ParentID 2。也就是说,除了对应的 ParentID 之外,它还必须始终包含具有自己 ID 的行。
标签: sql sql-server hierarchy