N层父母/儿童面包屑路径 - 从底部到顶部循环

时间:2011-11-10 14:19:40

标签: c# asp.net sql-server-2005 recursion

我正在尝试根据SQL数据库表中的父/子关系构建面包屑跟踪。我过去已经完成了这些工作,但我现在需要做的是从下往上(向后)向上走过层次结构。

这是我的DataTable的样子:

DocID | ParentDocID | 命名
7 | 0 |图像(根)
24 | 7 | JPG(2级)
34 | 24 |尺寸(等级3)

所以这是一个N层架构。我总是通过查询字符串变量知道我的等级。我需要从下往上循环,以便用户可以为它们所在的层结构中的哪个级别添加书签。我无法搞清楚这一点。我不能使用session或viewstate。

期望的结果:

用户转到此链接: Default.aspx?DocId = 34 - 然后他们看到这样的痕迹痕迹:
主页> 图片> JPG > 大小

Default.aspx?DocId = 24 - 然后他们看到这样的痕迹痕迹:
主页> 图片> JPG

我已经硬编码的“Home”元素。我还需要跟踪链接中的每个项目,除了您所在的级别。

我希望这可以用C#代码完成。我也对SQL级存储过程选项持开放态度。

非常感谢任何帮助。提前谢谢!

这是我正在尝试的一些SQL,但没有得到我需要的结果。我希望这会有所帮助:

WITH Hierachy([DocID], [ParentDocID], [Name], [Level]
AS
(
SELECT [DocID], [ParentDocID], [Name], 0 AS [Level]
FROM [Documents] d
WHERE (d.[ParentDocID] = 7) AND ([Folder] = 1) AND ([Status] = 'A') AND ([AppGroupID] = 4)
UNION ALL
SELECT d.[DocID], d.[ParentDocID], d.[Name], dh.[Level] + 1
FROM [Documents] d
INNER JOIN Hierachy dh
--ON d.ParentDocID = dh.DocID
ON dh.[ParentDocID] = d.[DocID] -- bottom up apporach
WHERE ([Folder] = 1) AND ([Status] = 'A') AND ([AppGroupID] = 4)
)
SELECT [DocID], [ParentDocID], [Name]
FROM Hierachy
--WHERE [Level] > 0

我明白了!这是有效的SQL:

WITH Hierachy([DocID], [ParentDocID], [Name], [Level])
AS
(
SELECT [DocID], [ParentDocID], [Name], 0 AS [Level]
FROM [Documents] d
WHERE (d.[DocID] = @ParentDocID) AND ([Folder] = 1) 
AND ([Status] = 'A') AND ([AppGroupID] = @AppGroupID)
UNION ALL
SELECT d.[DocID], d.[ParentDocID], d.[Name], dh.[Level] + 1
FROM [Documents] d
INNER JOIN Hierachy dh
ON dh.[ParentDocID] = d.[DocID]
WHERE ([Folder] = 1) 
AND ([Status] = 'A') AND ([AppGroupID] = @AppGroupID)
)
SELECT [DocID], [ParentDocID], [Name]
FROM Hierachy
ORDER BY [Level] DESC
)

3 个答案:

答案 0 :(得分:0)

当然可以。您可以使用CURSOR或WHILE LOOP或XML。 我有一个像你这样的例子。这是带有临时表的WHILE LOOP,它选择具有提供ID的节点的父节点:

DECLARE @ID INT = 4
DECLARE @Parent_ID INT
DECLARE @Tree TABLE
(
    ID int,
    Value NVARCHAR(10),
    Parent_ID int
)

SELECT @Parent_ID = Parent_ID FROM Tree 
WHERE ID = @ID

WHILE @Parent_ID IS NOT NULL
BEGIN
    INSERT INTO @Tree
    SELECT * FROM Tree
    WHERE ID = @Parent_ID

    SELECT @Parent_ID = Parent_ID FROM Tree
    WHERE ID = @Parent_ID
END

SELECT * FROM @Tree

答案 1 :(得分:0)

This描述了解决类似问题,即走上树。任何内联sql,例如最好在存储过程中执行。在SQL中解决它可能是最好的方法,因为你已经拥有了所有的数据。

答案 2 :(得分:0)

检查以下链接,您将获得问题的完美答案。

SQL Server: How to get all child records given a parent id in a self referencing table