0

我有一张如下表,

Create Table Entries
(
    EntryID int,
    ParentEntryID int, // -1 if root node
    EntryText nvarchar(100)
)

我需要编写一个存储过程,它接受一个叶子 EntryID并从该叶子条目开始通过根条目返回所有条目。最好的方法是什么?

我想要的存储过程如下所示,

CREATE PROCEDURE dbo.GetPath
    @leafEntryID int
AS     
    // what to do...
GO

我搜索了一下,发现了两种方法:

  1. 使用临时表并基本上使用for循环向其中插入新行。(我不确定如何准确实现它。)
  2. 使用游标。(我对这种方式不太了解,这是更好的方法吗?)

PS:我使用的是 Microsoft SQL Server 2008

4

2 回答 2

2

您使用的模型称为邻接列表,它需要递归查询来处理。

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
于 2013-04-16T11:09:35.273 回答
1

您可以在StackOverflow Wiki上阅读有关存储分层数据的不同方法 ,我也建议您查看这个 MS SQL 数据类型hierarchyId

当然,对于 MS SQL 中的邻接列表模型,您应该使用为您编写的递归 CTE Quassnoi

于 2013-04-16T11:19:48.673 回答