Иерархический вопрос SQL - PullRequest
       20

Иерархический вопрос SQL

2 голосов
/ 26 августа 2009

У меня есть базовая древовидная структура сущностей. Дерево может иметь максимальную глубину 5 узлов, но может иметь ширину N узлов. Я отобразил это соотношение в таблице, как показано ниже:

myID | myDescription | myParentID

Я начинаю с известного объекта, который может означать начальный «myID». Теперь я хочу получить все дочерние узлы. Есть ли способ получить все дочерние узлы в одном операторе? Это должно включать детей моих детей, и идти вниз по дереву. Я использую Oracle SQL.

Спасибо, Jay

Ответы [ 3 ]

4 голосов
/ 26 августа 2009
SELECT  *
FROM    mytable
START WITH
        myid = :id
CONNECT BY
        myparentid = PRIOR myid
0 голосов
/ 26 августа 2009

Возможный аккуратный способ реализовать это - добавить еще одно поле, содержащее «путь» к записи. Скажем, верхняя запись - ID = 1. У него есть дочерний элемент с ID = 5, и у него снова есть дочерний элемент с ID = 20, тогда в последней записи будет путь / 1 / 5/20 Поэтому, если вы хотите, чтобы все дочерние узлы вашего верхнего узла вы делали

select * from MyTable where Path like '/1/%'

(извините, синтаксис сервера sql, я не являюсь разработчиком оракула - но концепция все еще применима)

Чтобы получить детей среднего узла

select * from MyTable where Path like '/1/5/%'

Отличительной особенностью этого решения является то, что вы можете применять индексы к полю "путь", поэтому оператор будет выполняться с использованием только одного сканирования индекса, что делает его очень эффективным.

0 голосов
/ 26 августа 2009

Я бы предложил использовать другой способ моделирования иерархии, если вы хотите получить все узлы в одном запросе. Одна очень хорошая и распространенная реализация - это модель nested set . В статье рассказывается, как это реализовано в MySQL, но его легко перенести в Oracle.

...