【发布时间】:2009-07-14 10:56:57
【问题描述】:
鉴于我有这个结果集结构(多余的字段已被剥离)
Id | ParentId | Name | Depth
----------------------------
是否可以按树顺序返回记录,即Parent 然后Children,如果Child 是Parent,那么它们的Children,如果不是那么Sibling,等等?例如,
Id | ParentId | Name | Depth
----------------------------
1 NULL Major 1
2 1 Minor 2
3 1 Minor 2
4 3 Build 3
5 3 Build 3
6 1 Minor 2
/* etc, etc */
我能想到的唯一方法就是关注这篇文章 -
Improve hierarchy performance using nested sets
并在每条记录中包含[LeftExtent] 和[RightExtent] 字段。现在文章中的 SQL 在Ids 是唯一的情况下工作正常,但是在这个特定的树结构中,具有相同Id 的记录可以出现在树中的不同位置(ParentId 字段显然不同)。我认为问题出在文章中的这个 SQL 中 -
INSERT INTO @tmpStack
(
EmployeeID,
LeftExtent
)
SELECT TOP 1 EmployeeID, @counter
FROM Employee
WHERE ISNULL(ParentID, 0) = ISNULL(@parentid,0)
/* If the Id has already been added then record is not given [LeftExtent] or [RightExtent] values. */
AND EmployeeID NOT IN (SELECT EmployeeID FROM @tmpStack)
如何更改此设置以允许为具有重复 Ids 的记录提供 [LeftExtent] 和 [RightExtent] 值,或者我完全错过了按我需要的顺序返回结果集的更简单方法?
【问题讨论】:
标签: sql sql-server sql-server-2005 tree nested-sets