如何在 Sql 服务器中获取层次结构 table

How to get a hierarchy table in Sql Server

我想创建一个 table 来显示另一个 SQL 服务器 table 的层次结构。 我有一个 table 具有以下结构

+-----------+----------+
| AccountID | ParentID |
+-----------+----------+
| 1         |          |
+-----------+----------+
| 2         | 1        |
+-----------+----------+
| 3         | 1        |
+-----------+----------+
| 4         | 2        |
+-----------+----------+
| 5         | 3        |
+-----------+----------+
| 6         | 5        |
+-----------+----------+

并希望获得另一个具有以下结构的 table

+-----------+------+
| 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    |
+-----------+------+

注意:在 Parents ID 字段中,您必须始终包含您自己的 ID,即 1-1、2-2 等。

如果您在第一个 table 中看到,对于 AccountID 1,没有 ParentID,因为它是最高层级。但是在我需要提取的 table 中,您会看到对于 AccountID 1,值 1 出现在 Path 列中。其余值也是如此,即对于 AccountID 2,在结果中出现 table 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,递归 向下 层次结构的每个级别,直到到达底部:

--Sample Data
WITH YourTable AS(
    SELECT V.AccountID,
           V.[Path]
    FROM (VALUES(1,NULL),
                (2,1),
                (3,1),
                (4,2),
                (5,3),
                (6,5))V(AccountID,[Path])),
--Solution
rCTe AS(
    SELECT YT.AccountID AS RootID,
           YT.AccountID,
           YT.[Path]
    FROM YourTable YT
    UNION ALL
    SELECT r.RootID,
           YT.AccountID,
           YT.[Path]
    FROM rCTe r
         JOIN YourTable YT ON r.[Path] = YT.AccountID)
SELECT r.RootID AS AccountID,
       r.AccountID AS [Path]
FROM rCTe r
ORDER BY AccountId,
         [Path];

DB<>Fiddle

我试过这句话,基于你的句子,

WITH rCTe AS (
    SELECT YT.Accountid AS RootID,
           YT.Accountid,
           YT.Parentaccountid
    FROM PBI_OrganizacionJerarquica YT
    UNION ALL
    SELECT r.RootID,
           YT.Accountid,
           YT.Parentaccountid
    FROM rCTe r
         JOIN PBI_OrganizacionJerarquica YT ON r.Parentaccountid = YT.Accountid)

SELECT r.RootID AS AccountID,
       r.Accountid AS [Path]
FROM rCTe r
ORDER BY AccountId,
         [Path];

我收到这个错误

消息 319,级别 15,状态 1,第 3 行 关键字 'with' 附近的语法不正确。如果这条语句是一个普通的 table 表达式、一个 xmlnamespaces 子句或一个更改跟踪上下文子句,则前面的语句必须以分号结束。