在SQL表中存储树

时间:2013-04-16 11:06:39

标签: tsql adjacency-list

我有一张如下表格,

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

我搜索了它,找到了两种方法:

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

2 个答案:

答案 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