如何进行 sql 查询来构建树? [复制]
Posted
技术标签:
【中文标题】如何进行 sql 查询来构建树? [复制]【英文标题】:How to make an sql query to build a tree? [duplicate] 【发布时间】:2012-08-23 16:29:19 【问题描述】:可能重复:How to store directory / hierarchy / tree structure in the database?
我使用这个查询:
SELECT Id, Name, ParentId
FROM Table_1
然后我使用所有元素构建树。
但是如果我想构建一个从明确的Id
开始的树怎么办,所以我需要进行一个查询,只返回这个Id
和这个Id
的所有孩子
像这样:
SELECT Id, Name, ParentId
FROM Table_1
WHERE (Id = randomNumber) OR (all possible childs of Id = randomNumber)
请帮我查询。
编辑:
这就是您在 Oracle 中的制作方法
SELECT Id, Name, ParentId
FROM table_1
Connect by prior Id = ParentId
Start with Id = randomNumber
我需要 MS-Access
【问题讨论】:
你想获取parentid的children和children的children等等对吧? @András Ottó,这有关系吗? 是的,因为如果它只有一层深,你可以从这两个anawers中选择一个:) 如果它更多,那么你需要更多,一个递归解决方案,你可以使用存储过程 f.e. 来管理。但我得到了答案,我想知道 devundef 问了什么:) @András Ottó,它不仅深一层,还可能更多 @András Ottó,你能告诉我吗? 【参考方案1】:试试这个,我希望这是你要找的:
DECLARE @ID int
SET @ID = 1;
WITH CTE_Table_1
(
ID,
Name,
ParentID,
TreeLevel
)
AS(
SELECT
ID,
Name,
ParentID,
0 AS TreeLevel
FROM Table_1
WHERE ID = @ID
UNION ALL
SELECT
T.ID,
T.Name,
T.ParentID,
TreeLevel + 1
FROM Table_1 T
INNER JOIN CTE_Table_1 ON CTE_Table_1.ID = T.ParentID
)
SELECT * FROM CTE_Table_1
【讨论】:
【参考方案2】:正如相关文章所述,这不能单独使用 SQL 完成,但是可以使用 SQL 和 VBA 的组合相对容易地完成。
目标是指定的Id
返回该记录及其所有子记录。因此,您只需要一个布尔函数,当行 Id
是指定祖先的直接后代时,该函数返回 true。
您的 SQL 将是:
SELECT Id, Name, ParentId
FROM Table_1
WHERE IsDescendant(Id, randomNumber);
Access 中的 VBA 函数是:
Public Function IsDescendant(id As Integer, relative As Integer) As Boolean
Dim currentID As Variant
currentID = id
Do Until IsNull(currentID)
If (currentID = relative) Then
IsDescendant = True
Exit Function
End If
currentID = DLookup("ParentId", "Table_1", "Id=" & currentID)
Loop
IsDescendant = False
End Function
就性能而言,这可能不是最好的,因为我使用了DLookup
,但如果要获得显着的性能提升,我们也可以使用RecordSet
对象。这只是我能记下的最快的代码。
【讨论】:
【参考方案3】:您可以将表连接到自己的表,将父 ID 链接到子 ID
SELECT T1.Id, T1.Name, T2.Id, T2.Name
FROM Table_1 as T1
JOIN Table_1 as T2 on T1.Id = T2.ParentId
给定数据
Id, Name ParentId
1, Top, null
2, ChildOne, 1
3, ChildTwo, 1
4, ChildThree, 1
这会给你一个类似的结果
1, Top, 2, ChildOne
1, Top, 3, ChildTwo
1, Top, 4, ChildFour
【讨论】:
如果你有多个依赖,不仅仅是两个,而是三个级别?您无法获取给定 id 的孩子的孩子。 如果您希望它是递归的,那么您可能正在查看构建存储过程的递归列表?【参考方案4】:你快到了,这应该可以解决问题
SELECT Id, Name, ParentId
FROM Table_1
WHERE (Id = randomNumber) OR (ParentId = randomNumber)
【讨论】:
这不是只构建树的一层吗? 这只返回根和这个根的孩子,但是孩子的孩子在哪里? 该死,你当然是对的。试试安德拉斯的回答。以上是关于如何进行 sql 查询来构建树? [复制]的主要内容,如果未能解决你的问题,请参考以下文章