在SQL中从邻接列表构建枚举路径

时间:2014-04-29 15:15:00

标签: sql tree hierarchy adjacency-list

初始方案

我的软件使用树数据结构,并将其存储在SQL中。我使用名为邻接列表的抽象,其中包含存储IDParentID的每一行。

ID主键ParentID是同一个表中的外键

问题

我想"转换"我的SQL抽象为 Path Enumeration 。它由存储ID的每一行和存储从根到当前行的ID路径的varchar字段组成。例如,此树中Path行的ID = 6字段:

Tree

将是/1/2/4/6/。更多详细信息here,名称为 Lineage Column

问题

如何从仅包含PathID的现有数据库构建列ParentID

2 个答案:

答案 0 :(得分:1)

SQL Server 2005以后应该支持以下内容:

WITH
  recursed_tree AS
(
  SELECT
    IDObject,
    concat('/', cast(IDObject as varchar(100)))   AS Path
  FROM
    tbObject
  WHERE
    ParentID IS NULL

  UNION ALL

  SELECT
    next.IDObject,
    concat(prev.Path, '/', cast(next.IDObject as varchar(100)))   AS Path
  FROM
    recursed_tree   AS prev
  INNER JOIN
    tbObject        AS next
       ON prev.IDObject = next.ParentID
)

SELECT
  *
FROM
  recursed_tree

答案 1 :(得分:0)

我想出了这个SQL Server查询:

[tbObjectHierarchy有一个名为IDObject的FK和PK以及一个名为varchar的{​​{1}}

Path