【问题标题】:Access ancestors访问祖先
【发布时间】:2013-12-08 19:03:18
【问题描述】:

我有一个 Access db 表,其中包含几个值:(SourceId,DestinationId)。这两个值都取自同一个 ID 列表。 我想创建所有项目祖先的列表(查询结果?)。即,如果用户输入 Id=15,我想返回作为 source-15 目的地的所有 Id,以及它们的目的地等。 例如,如果我的桌子持有

15, 3 |
15, 4 |
4, 7 |
4, 8 |
3, 5 |
5, 2 |
1, 9 

我想返回 3、4、7、8、5、2(但不返回 9)。

我想解决方案应该包含一些带有循环或递归的 VBA 代码,但我对记录集与集合感到困惑。

有什么想法吗? 谢谢, 阿维拉姆

【问题讨论】:

  • 祖先的深度是固定的(例如 parent-child-grandchild-grandgrandchild)还是任意的?

标签: sql vba ms-access recursion


【解决方案1】:

不幸的是,Access SQL 缺少 Oracle 用于执行分层查询的 CONNECT BY 语法。但是,如果您准备创建一个临时表,您可以在 Access 中使用循环模拟它。 在此示例中,您的原始表是“LinkTab”,临时表是“TmpTree”,并且您从 SourceID 15 开始。

第一次执行:

SELECT SourceID, DestID, 1 as Lvl INTO TmpTree FROM LinkTab WHERE SourceID = 15 

然后在一个循环中,重复执行:

INSERT INTO TmpTree ( SourceID, DestID, Lvl )
SELECT newrows.SourceID, newrows.DestID, TmpTree.Lvl + 1
FROM TmpTree INNER JOIN LinkTab newrows ON TmpTree.DestID = newrows.SourceID
WHERE TmpTree.Lvl = (SELECT MAX(Lvl) FROM TmpTree)

直到语句返回零个受影响的行(或者如果您无法检测到这一点,则每次计算 TmpTree 中的行数并在它们不增加时停止)

现在可以使用以下命令检索您的结果:

SELECT DestID FROM TmpTree

最后,整理一下:

DROP TABLE TmpTree

我已经在 Access Query 设计器中测试了这些语句,它们得到了预期的结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-11
    • 2019-10-07
    • 1970-01-01
    • 2017-11-25
    相关资源
    最近更新 更多