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