[英]Build Enumeration Path from Adjacency List in SQL
我的软件使用树数据结构,并将其存储在 SQL 中。 我使用名为Adjacency List的抽象,它由存储ID
和ParentID
的每一行组成。
ID
是主键, ParentID
是同一个表的外键。
我想将我的 SQL 抽象“转换”为Path Enumeration 。 它由存储ID
的每一行和存储ID
路径的varchar
字段组成,从根到当前行。 例如,这棵树中ID = 6
行的Path
字段:
将是/1/2/4/6/
。 此处有更多详细信息,名称为Lineage Column 。
如何从只有ID
和ParentID
的现有数据库构建列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 以及一个名为Path
的varchar
]
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.