Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Составление SQL-запросов > Помогите написать хитровыдуманный запрос |
Автор: polin11 22.11.2018, 02:36 | ||
СУБД postgresql. Помогите написать хитровыдуманный запрос, есть иерархическая таблица - боги Древней Греции. У каждой записи, есть поле parent_id - идентификатор родителя записи, level - уровень записи. Уровень 1. Корень - Хаос (дети: Зевс, Посейдон) Уровень 2. Зевс (дети: Афина, Гермес) Посейдон(дети: Тритон) Уровень 3. Афина (дети: Эрхитоний) Гермес (дети: нет) Тритон (дети: нет) Уровень 4. Эрхитоний (дети: нет)
Как итог имеем n-арное дерево, нужно написать хитровыдуманный запрос, который сделает прямой обход этого дерева. В итоге нужно получить список 1) Хаос 2) Зевс 3) Афина 4) Эрхитоний 5)Гермес 6) Посейдон 7) Тритон |
Автор: ksnk 22.11.2018, 11:44 |
polin11, А цель хитровыдуманности какая ? Для обучения и спорта, или потом с этим надо будет жить ? Если жить - то можно трансформировать табличку в nested-sets (добавить в нее пару полей) и получать поддерево любой веточки одним простым запросом. Если хочется спорта и постгресса, то вот поправленный запрос с предыдущего ответа https://www.db-fiddle.com/f/6iRkVhCfa3Z6wuw6dMETC5/0 P.S. ![]() |
Автор: Snowy 22.11.2018, 12:39 | ||
|
Автор: Akina 22.11.2018, 12:47 |
Snowy, нормализуйте g.id ведущими нулями - иначе при сортировке чисел как строк всё поплывёт... или добавьте разделитель. |
Автор: Snowy 22.11.2018, 12:51 |
Угу. оно элементарно высчитывается, как cardinality(r.path) Это не строка, а массив integer[] |