访问祖先

时间:2013-11-24 00:18:42

标签: sql vba ms-access recursion

我有一个Access数据库表,它包含几个值:(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代码,但我对记录集与集合感到困惑。

有什么想法吗? 谢谢, Aviram

1 个答案:

答案 0 :(得分: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设计器中测试了这些语句,它们得到了理想的结果。