2013-11-24 132 views
2

我有一個Access數據庫表,它包含多對值:(SourceId,DestinationId)。這兩個值都來自同一個Id列表。 我想創建所有項目祖先的列表(查詢結果?)。也就是說,如果用戶輸入編號= 15,我想返回所有ID所爲源,15個目的地,也是他們的目的地等 例如,如果我的表持有訪問祖先

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

Id喜歡返回3,4,7,8,5,2(但不返回9)。

我想解決方案應該包括一些帶循環或遞歸的VBA代碼,但是我被記錄集與集合混淆了。

有什麼想法? 謝謝, Aviram

+0

是固定祖先的深度(例如父母 - 子孫 - 孫子女)還是任意? –

回答

1

不幸的是,訪問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查詢設計這些報表,他們得到想要的結果。