我有一张如下表格,
Create Table Entries
(
EntryID int,
ParentEntryID int, // -1 if root node
EntryText nvarchar(100)
)
我需要编写一个存储过程,它接受 leaf EntryID
并从该条目条目开始通过根条目返回所有条目。这样做的最佳方式是什么?
我想要的存储过程类似于以下内容,
CREATE PROCEDURE dbo.GetPath
@leafEntryID int
AS
// what to do...
GO
我搜索了它,找到了两种方法:
for
循环向其插入新行。 (我不确定如何实现它。)PS:我正在使用Microsoft SQL Server 2008
答案 0 :(得分:2)
您正在使用的模型称为adjacency list,它需要递归查询才能处理。
在SQL Server
和其他几个引擎中,这可以通过使用所谓的递归CTE(公用表表达式)来实现:
WITH q AS
(
SELECT *
FROM entries
WHERE entryId = @leafEntryId
UNION ALL
SELECT e.*
FROM q
JOIN entries e
ON e.entryId = q.parentEntryId
)
SELECT *
FROM q
答案 1 :(得分:1)
您可以阅读有关在StackOverflow Wiki上存储分层数据的不同方法,我建议您查看此MS SQL数据类型hierarchyId
当然,对于MS SQL中的邻接列表模型,您应该使用为您编写的递归CTE Quassnoi。