gpt4 book ai didi

sql-server - 如何从 SQL 表中检索分层数据?

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

我有下面的存储过程来返回 Id、parentId 和 AbsoluteUrls 的列表,它工作得很好:

ALTER PROCEDURE [dbo].[SearchDataManager.HierarchyById] 
@currentId AS int
AS
BEGIN
DECLARE @id INT
DECLARE @parentId INT
DECLARE @absoluteUrl NVARCHAR(1000)

DECLARE @Hierarchy TABLE (Id int, ParentId int, AbsoluteUrl nvarchar(1000))

WHILE @currentId != 0
BEGIN

SELECT @id = Id, @parentId = ParentId, @absoluteUrl = AbsoluteUrl
FROM dbo.[SearchDataManager.NiceUrls]
WHERE id = @currentId

INSERT INTO @Hierarchy VALUES (@id, @parentId, @absoluteUrl)

SET @currentId = @parentId
END

SELECT * FROM @Hierarchy
END

“NiceUrls”表具有 Id 和 ParentId。 ParentId 指的是同一个表中的一条记录。

它返回如下:

 ----------------------------------
Id | ParentId | AbsoluteUrl
----------------------------------
294 | 5 | url1
5 | 2 | url2
2 | 0 | url3

上面的代码使用 WHILE 循环并定义表变量可以正常工作,但我只是想知道是否有更好的方法从表中检索层次结构数据?

上面代码的问题是可维护性。如果我需要再返回 NiceUrls 表的 1 列,那么我必须定义一个新变量,将该列添加到内联表等。

有没有更好的方法重写sp?

谢谢

这是什么

最佳答案

with Hierarchy (Id, ParentId, AbsoluteUrl, Level)
AS
(
-- anchor member
SELECT Id,
ParentId,
AbsoluteUrl,
0 AS Level
FROM dbo.[NiceUrls]
WHERE id = @currentId
UNION ALL
-- recursive members
SELECT su.Id,
su.ParentId,
su.AbsoluteUrl,
Level + 1 AS Level
FROM dbo.[NiceUrls] AS su
INNER JOIN Hierarchy ON Hierarchy.ParentId = su.Id
)
SELECT * FROM Hierarchy

关于sql-server - 如何从 SQL 表中检索分层数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11230693/

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