2

可能重复:
如何在数据库中存储目录/层次结构/树结构?

我使用这个查询:

SELECT Id, Name, ParentId
FROM Table_1

然后我使用所有元素构建树。

但是如果我想构建一个从 definite 开始的树怎么办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

4

4 回答 4

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
于 2012-08-23T18:26:06.093 回答
0

您可以加入表格本身,将父 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
于 2012-08-23T16:31:56.763 回答
0

你快到了,这应该可以解决问题

SELECT Id, Name, ParentId 
FROM Table_1 
WHERE (Id = randomNumber) OR (ParentId = randomNumber) 
于 2012-08-23T16:33:07.807 回答
0

如相关文章所述,这不能单独使用 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这只是我能记下的最快的代码。

于 2012-08-23T23:02:29.150 回答