繁体   English   中英

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

[英]Build Enumeration Path from Adjacency List in SQL

初始场景

我的软件使用树数据结构,并将其存储在 SQL 中。 我使用名为Adjacency List的抽象,它由存储IDParentID的每一行组成。

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

问题

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

树

将是/1/2/4/6/ 此处有更多详细信息,名称为Lineage Column

如何从只有IDParentID的现有数据库构建列Path

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

我想出了这个 SQL Server 查询:

[ tbObjectHierarchy有一个名为IDObject的 FK 和 PK 以及一个名为Pathvarchar ]

declare @T  as table (IDObject int, Path varchar(500))
declare @T2 as table (IDObject int, Path varchar(500))

insert into tbObjectHierarchy(IDObject, Path)
select o.IDObject, concat('/', cast(o.IDObject as varchar(100)), '/') as Path
from tbObject as o 
where o.ParentID is null

insert into @T (IDObject, Path)
select o.IDObject, concat(h.Path, cast(o.IDObject as varchar(100)), '/') as Path
from tbObject as o
inner join tbObjectHierarchy as h
on o.ParentID = h.IDObject

while exists (select top 1 * from @T)
begin
    insert into tbObjectHierarchy (IDObject, Path)
    select t.IDObject, t.Path
    from @T as t

    delete from @T2

    insert into @T2
    select o.IDObject, concat(t.Path, cast(o.IDObject as varchar(100)), '/') as Path
    from tbObject as o
    inner join @T as t
    on o.ParentID = t.IDObject

    delete from @T

    insert into @T
    select * from @T2
end

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM