Babamani Ответов: 2

Запрос MS Access для извлечения иерархических записей


Я хочу получить иерархические записи из базы данных MS Access в запросе Select. Кто-нибудь может мне помочь ?
Например, подключиться к PRIOR в Oracle , я хочу что-то подобное в MS Access.

У меня есть имена столбцов и записи, подобные этому:

FIRST_NAME LAST_NAME FAMILY_ID PARENT_ID путь
-----------------------------------------------------------------------------
Quackmore Duck 201 200 /Крякмор
Тельма Дак 203 201 /Крякмор/Тельма
Huey Duck 205 203 /Quackmore/Thelma/Huey
Дьюи Дак 206 203 /Квакмор/Тельма/Дьюи
Луи Дак 207 203 /Квакмор/Тельма/Луи
Дональд Дак 204 201 /Квакмор/Дональд


Результат должен быть таким:


FIRST_NAME LAST_NAME FAMILY_ID PARENT_ID PARENT_NAME
----------------------------------------------------------------------------
Крякморская Утка 201 200
Тельма Дак 203 201 Крякмор
Хьюи Дак 205 203 Тельма
Дьюи Дак 206 203 Тельма
Луи Дак 207 203 Тельма
Дональд Дак 204 201 Крякмор


Причем глубина иерархической структуры может быть до любого уровня.
Пожалуйста, кто-нибудь, помогите мне быстро.

Заранее благодарю вас... Пожалуйста ....пожалуйста...

2 Ответов

Рейтинг:
13

Dave Kreskowiak

Не поддерживается в Access. Access также не поддерживает хранимые процедуры.

Чтобы сделать это в Access, вам нужно будет получить записи верхнего уровня, затем повторить их и запросить для детей, повторить их и запросить для детей, ..., пока вы не получите никаких записей обратно.


Рейтинг:
1

RavonX

Я не уверен, насколько это может быть актуально...

Private Sub LoadData
   'create datatable to fill with edited results
   Dim MyFixedTable as new datatable("edited results")
   'specify search criteria
   Dim colToSearch as String = "LAST_NAME"
   Dim searchingFor as String = "Duck"
   Dim expressionString as String = colToSearch & " LIKE '" & searchingFor & "'"

   '.select
   Dim returnedDataRows() as DataRow = 
      DatabaseForm.MyDataSet.MyDataBase.Select(expressionString)

   'if results found, fix results into new table
   if returnedDataRows.Length > 0
      For idx = 0 to returnedDataRows.length - 1
          Dim DataRow2Send as DataRow = returnedDataRows(idx)
          FillMyFixedTable(MyFixedTable, DataRow2Send)
      Next
      FillInParents(MyFixedTable)
   End If
End Sub

Private Sub FillMyFixedTable(ByRef FixedTable as DataTable, byval NewRow as DataRow)
   Dim newDRow as FixedTable.NewRow
   newDRow.Item(0) = NewRow.item(0)
   newDRow.Item(1) = NewRow.item(1)
   newDRow.Item(2) = NewRow.item(2)
   newDRow.Item(3) = NewRow.item(3)
   FixedTable.Rows.Add(newDRow)
End Sub

Private Sub FillInPArents(ByRef FixedTable as DataTable)
   for idx = 0 to FixedTable.Rows.Count - 1
       dim ParentTableRow as dataRow = FixedTable.Rows.Find(FixedTable.Rows(idx).Item(3))
       if not ParentTableRow is nothing
           FixedTable.Rows(idx).item(4) = ParentTableRow.Item(0)
       else
           FixedTable.Rows(idx).item(4) = "" 
       end if
   Next
End Sub