У меня есть древовидная структура, которая определена на двух таблицах, которые мне нужно использовать для разработки, начиная с листового объекта, пути к папке, в котором существует листовой объект.Рекурсивный запрос с использованием двух таблиц?
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» подаются на следующую итерацию рекурсии.
Сделайте это достаточно времени, и я получаю путь, состоящий из каждого имени папки, из листового объекта обратно в корневую папку.
Но опять же, я хотел бы сделать это рекурсивно в одном запросе ...
Попробуйте использовать [иерархический (ака «connect by») запрос] (http://docs.oracle.com/cd/B28359_01/server.111/b28286/queries003.htm) –
Спасибо @TonyAndrews, ссылка вы предоставили мне помощь в этом. – MidnightThoughtful