我正在尝试根据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
)
答案 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)