如何进行 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 查询来构建树? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

sql:如何存储树数据并进行递归遍历(通过查询)?

IQueryable 如何构建查询? [复制]

如何使用 SQL 查询连接两个表? [复制]

mysql 如何查询一个带有树结构的表的数据

Laravel 查询构建器 - 如何按别名分组,或进行原始 groupBy

如何在 Azure 数据工厂中执行 SQL 查询