所以鏈接的表格給出了自加盟文檔,你絕對需要一個文檔能夠:
- 鏈接本身
- ...很多次,因爲它喜歡
- 鏈接到另一個文檔
- ...多次
- 被同其他文檔分別連接到
- ...多次
- 關於鏈接存儲信息
所以你的鏈接表可能有10個單獨的鏈接1-1,1-1,1-1,1-2,1-2,1-2,2-1, 2-1,2-1,2-2等,只有2個文件在'家庭'中。
當你看這個名單,你可能會認爲你不需要他們大多我希望,在解決方案中很多低效率可能會從這種不必要的靈活性到來。我最喜歡的建議是從嚴格的層次開始,並從那裏開始建設。
但無論如何,這是我的答案,它在Access-2010和本地表中進行了測試和工作。 ADODB應該和鏈接表一樣工作。
Option Compare Database
Option Explicit
Const MaxInFamily = 30
'Requires a reference to "Microsoft ActiveX Data Objects 2.x Library" (VBA Menu: Tools, references)
Function GetFamily(id As Long) As Long()
Dim Found(MaxInFamily) As Long
Dim MaxFound As Integer
Dim CurrentSearch As Integer
Dim Sql As String
Dim rs As New ADODB.Recordset
Found(1) = id
MaxFound = 1
For CurrentSearch = 1 To MaxInFamily
If CurrentSearch > MaxFound Then Exit For
Sql = "SELECT doc_id_2 as NewID FROM link WHERE doc_id_1 = " & Found(CurrentSearch) _
& " AND doc_id_2 NOT IN (" & ArrayToCsv(Found, MaxFound) & ")" _
& " UNION " _
& " SELECT doc_id_1 FROM link WHERE doc_id_2 = " & Found(CurrentSearch) _
& " AND doc_id_1 NOT IN (" & ArrayToCsv(Found, MaxFound) & ")"
rs.Open Sql, CurrentProject.Connection
Do While Not rs.EOF
MaxFound = MaxFound + 1
Found(MaxFound) = rs("NewID").Value
rs.MoveNext
Loop
rs.Close
Next CurrentSearch
GetFamily = Found
End Function
Function ArrayToCsv(SourceArray() As Long, ItemCount As Integer) As String
Dim Csv As String
Dim ArrayIndex As Integer
For ArrayIndex = 1 To ItemCount
Csv = Csv & SourceArray(ArrayIndex)
If ArrayIndex < ItemCount Then Csv = Csv & ", "
Next ArrayIndex
ArrayToCsv = Csv
End Function
重複的結果和查詢通過排除已經發現在服務器項目避免,併爲紐帶是單向的,我使用的UNION
查詢一次朝兩邊看。最多它會做MaxInFamily
往返服務器。
這是否有用? http://explainextended.com/2009/03/17/hierarchical-queries-in-mysql/ – Fionnuala
嗨Remou,謝謝你的隊友,明天再去探索你的鏈接。 – maxhugen
嗨Remou,謝謝你的伴侶(我們之前聊過並解決過的事情),明天再去探索你的鏈接。 雖然快速瀏覽一下,但它看起來只能處理父母/子女關係。在我的「連接」表中,我們想要的「家人」文檔可以是父母或孩子。這是一個未定義的層次結構(即根本沒有層次結構,記錄只是鏈接在一起)。 我目前有一個工會聯合,需要六個查詢才能達到2級深。作爲澳大利亞人,我樂意爲你提供一兩塊(啤酒)來幫助我。 – maxhugen