Форум программистов, компьютерный форум, киберфорум
PostgreSQL
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
14 / 0 / 0
Регистрация: 12.11.2015
Сообщений: 2

Как преобразовать таблицу с ltree-структуру в таблицу с вложенными множествами в PostgreSQL?

12.11.2015, 11:57. Показов 1677. Ответов 3

Студворк — интернет-сервис помощи студентам
Добрый день.

Я бы хотел спросить о возможности преобразования таблицы PostgreSQL, в которой используется структура ltree в таблицу со структурой вложенных множеств, где для каждого узла определены левая и правая границы. Можно ли это как-то сделать используя представления?
Например, у меня есть таблица в которой существует структура как на картинке:

Пример структуры

Объявление таблицы
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
    StructureLtree(id INT PRIMARY KEY, VALUE TEXT, path ltree);
    
    -- Данные:
 
    pk |  VALUE  |  path  |
    0  |   'A'   |   ''   |
    0  |   'B'   |   '1'  |
    0  |   'C'   |   '2'  |
    0  |   'D'   |  '1.3' |
    0  |   'E'   |  '1.4' |
    0  |   'F'   |  '1.5' |
    0  |   'G'   |  '2.6' |
    0  |   'H'   |  '2.7' |
И мне необходимо преобразовать это табличное представление в следующее:

SQL
1
StructureSets(id INT PRIMARY KEY, VALUE TEXT, lft INT, rgt INT);
, где левая и правая граница узла соответствует правилам определения вложенного множества.

У меня сейчас крутится идея вокруг такого представления. Оно позволяет получить данные о вершине, на каком уровне она находится и её порядковый номер на уровне.
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
    
    CREATE OR REPLACE RECURSIVE VIEW bfs (id, VALUE, path, num_on_level, level) AS
        SELECT id, VALUE, path, ROW_NUMBER() OVER (), 0 AS level
        FROM StructureLtree WHERE path ~ '*{0}'
        
        UNION ALL
        
        SELECT C.id, C.value, C.path, ROW_NUMBER() OVER (PARTITION BY P.path), level + 1 
        FROM StructureLtree C JOIN bfs P ON P.path @> C.path 
        WHERE nlevel(C.path) = level + 1;
 
    -- Данные представления
    id | VALUE | path | num_on_level | level |
    0  |  "A"  |  ""  |      1       |   0   |
    1  |  "B"  | "1"  |      1       |   1   |
    2  |  "C"  | "2"  |      2       |   1   |
    3  |  "D"  |"1.3" |      1       |   2   |
    4  |  "E"  |"1.4" |      2       |   2   |
    5  |  "F"  |"1.5" |      3       |   2   |
    6  |  "G"  |"2.6" |      1       |   2   |
    7  |  "H"  |"2.7" |      2       |   2   |
Но что делать, дальше, понять не могу (как установить границы "A" left = 1, right = 16, "B" left = 2, right = 9 и т.д.)

Может кто-нибудь подсказать идею?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
12.11.2015, 11:57
Ответы с готовыми решениями:

Как отобразить таблицу из БД postgresql в браузере
Подскажите каким методом таблицу из базы данных в Postgresql можно просмотреть или отобразить в браузере? ОС Centos

WPF: создать таблицу с вложенными таблицами
Собственно нужно построить вот такую таблицу: то есть существует таблица больших итераций по K, в каждой из которых существует таблица...

Как в структуру базы добавить таблицу с дизайнером?
Приветствую! Есть таблица с заказами: Как привинтить таблицу с дизайнером? Просто дизайнер всего лишь один, но к чему его...

3
1263 / 977 / 384
Регистрация: 02.09.2012
Сообщений: 3,021
13.11.2015, 00:08
"Как бы рекурсия" with recursive реализует обход графа в ширину, а нужен обход графа в глубину, да еще с возвратом к предыдущей родительской вершине.
В общем, сколько я не пыжился в свое время, у меня рекурсивным запросом не получилось сделать, реализовывал хранимой процедурой.
0
14 / 0 / 0
Регистрация: 12.11.2015
Сообщений: 2
13.11.2015, 14:28  [ТС]
В итоге нашел решение здесь
Как же все просто оказалось. Он просто посчитал количество предков и наследников для каждого узла, а затем исходя из этой информации рассчитал левый и правый индекс.
0
1263 / 977 / 384
Регистрация: 02.09.2012
Сообщений: 3,021
15.11.2015, 02:19
О классно! В таком направлении я не думал. Потестирую производительность запроса на разных данных.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
15.11.2015, 02:19
Помогаю со студенческими работами здесь

Сделать таблицу умножения, таблицу сложения, а также таблицу возведения в степень
Помогите написать код) Сделать таблицу умножения, таблицу сложения, а также таблицу возведения в степень. Функция:...

Как преобразовать список со списками в таблицу?
Сформировал список со списками, следующего вида: Вопрос, как сделать, чтобы 'Товар 1' 'Товар 2' стали началом новой строки,...

Как преобразовать XML в HTML таблицу?
Дорогие друзья! Помогите пожалуйста! Как XML с таким содержанием преобразовать в HTML таблицу? Я перерыл весь интернет, нашел кучу...

Не могу открыть таблицу PostgreSQL
Добрый день. Не могу открыть таблицу Postgre. Открываю базу: QSqlDatabase SearchDB = QSqlDatabase::addDatabase("QPSQL"); ...

В Laravel 5.6 / PostgreSql 9.6 сгруппировать таблицу
Всем привет! В Laravel 5.6 / PostgreSql9.6 нужно сгруппировать таблицу songs по полю title которых более одной так работает: ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а привычная функция main(). . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru