2015-08-07 6 views
0

У меня есть древовидная структура, которая определена на двух таблицах, которые мне нужно использовать для разработки, начиная с листового объекта, пути к папке, в котором существует листовой объект.Рекурсивный запрос с использованием двух таблиц?

FOLDER_DETAILS содержит информацию о предмете и папке, FOLDER_HIERARCHY содержит папку и ее родительскую папку, если она есть.

В каждом листовом объекте может быть один уровень папки глубиной, или это может быть 100 уровней папок в глубину.

На данный момент я использую рекурсивный код C# для выполнения запроса на уровень, который кажется дорогим и отнимает много времени на моем подключении к базе данных. Мне интересно, есть ли способ сделать это с помощью одного рекурсивного запроса?

Текущий метод:

Потому что начать этот процесс уже зная объект листа, легко для меня, чтобы получить его Object_ID и owner_id значения. Значение OWNER_ID для листового объекта - это идентификатор папки листа.

Оттуда, основной контур запросов Выполнения являются:

SELECT FD.FOLDER_NAME, FD.FOLDER_ID, FH.OWNER_ID 
FROM FOLDER_DETAILS FD 
    INNER JOIN FOLDER_HIERARCHY FH ON FD.FOLDER_ID = FH.ID 
WHERE FD.OBJECT_ID = :object_id 
AND FH.OWNER_ID = :owner_id; 

Из каждого запроса я собрать «FOLDER_NAME» значение как имя папки для этого уровня, и «FOLDER_ID» (становится OBJECT_ID) и «OWNER_ID» подаются на следующую итерацию рекурсии.

Сделайте это достаточно времени, и я получаю путь, состоящий из каждого имени папки, из листового объекта обратно в корневую папку.

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

+0

Попробуйте использовать [иерархический (ака «connect by») запрос] (http://docs.oracle.com/cd/B28359_01/server.111/b28286/queries003.htm) –

+0

Спасибо @TonyAndrews, ссылка вы предоставили мне помощь в этом. – MidnightThoughtful

ответ

Смежные вопросы