Гость
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Помогите написать хитровыдуманный запрос / 3 сообщений из 3, страница 1 из 1
22.11.2018, 02:15
    #39736496
polin11
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите написать хитровыдуманный запрос
Помогите написать хитровыдуманный
запрос, есть иерархическая таблица - боги Древней Греции.
У каждой записи, есть поле parent_id - идентификатор родителя записи, level - уровень записи.
Уровень 1. Корень - Хаос (дети: Зевс, Посейдон)
Уровень 2. Зевс (дети: Афина, Гермес)
Посейдон(дети: Тритон)
Уровень 3. Афина (дети: Эрхитоний)
Гермес (дети: нет)
Тритон (дети: нет)
Уровень 4. Эрхитоний (дети: нет)

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
CREATE TABLE gods(id integer PRIMARY KEY, name text,  parent_id integer, level integer);
INSERT INTO Gods VALUES(1,'Хаос', NULL, 1);
INSERT INTO Gods VALUES(2,'Зевс', 1, 2);
INSERT INTO Gods VALUES(3,'Посейдон', 1, 2);
INSERT INTO Gods VALUES(4,'Афина', 2, 3);
INSERT INTO Gods VALUES(6,'Гермес', 2, 3);
INSERT INTO Gods VALUES(7,'Тритон',3,3);
INSERT INTO Gods VALUES(8,'Эрхитоний',4,4);



Как итог имеем n-арное дерево, нужно написать хитровыдуманный запрос,
который сделает прямой обход этого дерева.
В итоге нужно получить список:
1) Хаос
2) Зевс
3) Афина
4) Эрхитоний
5)Гермес
6) Посейдон
7) Тритон
...
Рейтинг: 0 / 0
22.11.2018, 10:02
    #39736586
Partisan M
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите написать хитровыдуманный запрос
Я вижу следующие ошибки в постановке задачи.

1) Бога Эрхитония не существует.
2) Вставка в таблицу значения level излишняя, так как level можно вычислить по parent_id. Потенциально ведёт к ошибкам.
3) Противоречие между текстом в постановке задачи и примером таблицы. В тексте задаются пары родитель-потомок, а в таблице пары потомок-родитель. Можно сделать таблицу с несколькими строками для каждого родителя (по одной строке на потомка, и в этом случае необязательна колонка parent_id). То есть, привести в соответствие таблицу с текстом задачи.

Для обоих видов таблицы нужное решение можно получить с помощью обхода в глубину, который реализовать с помощью WITH RECURSIVE. Подходящий вид таблицы можно выбрать исходя из того, в каком порядке поступают данные. Я для себя составил примеры запросов WITH RECURSIVE для обоих видов таблицы. но без богов.
...
Рейтинг: 0 / 0
30.11.2018, 16:22
    #39741085
Alex URS
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите написать хитровыдуманный запрос
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Помогите написать хитровыдуманный запрос / 3 сообщений из 3, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]