gpt4 book ai didi

sql-server-2008 - SQL Server 2008 中的递归同表查询

转载 作者:行者123 更新时间:2023-12-03 21:07:02 24 4
gpt4 key购买 nike

我在 SQL Server 2008 数据库中有下表:

Id  Name       ParentFolder
-- ---- ------------
1 Europe NULL
2 Asia NULL
3 Germany 1
4 UK 1
5 China 2
6 India 2
7 Scotland 4

ParentFolder 是同一个表中 Id 的 FK。我想创建一个 View ,结果如下:
Id  Name       FullName
-- ---- --------
1 Europe Europe
2 Asia Asia
3 Germany Europe/Germany
4 UK Europe/UK
5 China Asia/China
6 India Asia/India
7 Scotland Europe/UK/Scotland

如您所见,我需要通过递归使用 ParentFolder 关系任意次数来构建 FullName 值,直到找到 NULL 为止。

编辑。 表中的每一行“知道”另一行是其父行,但不知道它在层次结构中的绝对位置。出于这个原因,每一行都存储其在层次树中的绝对位置的谱系系统是不合适的。

我知道 SQL Server 2008 的hierarchyid 功能,但据我所知,它只适用于固定数量的递归级别。但是,就我而言,您永远不知道会找到多少个级别,并且它们可能会逐行更改。

我也在这里看到了与此类似的问题。但是,我认为没有人要求为表中的每一行构建“路径”。对不起,如果我错过了。

非常感谢。

最佳答案

试试这个:

    DECLARE @tbl TABLE (
Id INT
,[Name] VARCHAR(20)
,ParentId INT
)

INSERT INTO @tbl( Id, Name, ParentId )
VALUES
(1, 'Europe', NULL)
,(2, 'Asia', NULL)
,(3, 'Germany', 1)
,(4, 'UK', 1)
,(5, 'China', 2)
,(6, 'India', 2)
,(7, 'Scotland', 4)
,(8, 'Edinburgh', 7)
,(9, 'Leith', 8)

;
WITH abcd
AS (
-- anchor
SELECT id, [Name], ParentID,
CAST(([Name]) AS VARCHAR(1000)) AS "Path"
FROM @tbl
WHERE ParentId IS NULL
UNION ALL
--recursive member
SELECT t.id, t.[Name], t.ParentID,
CAST((a.path + '/' + t.Name) AS VARCHAR(1000)) AS "Path"
FROM @tbl AS t
JOIN abcd AS a
ON t.ParentId = a.id
)
SELECT * FROM abcd

关于sql-server-2008 - SQL Server 2008 中的递归同表查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1757370/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com