Гость
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Рекурсивный запрос / 6 сообщений из 6, страница 1 из 1
31.01.2019, 14:41
    #39767629
Павел Гужанов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Рекурсивный запрос
Здравствуйте.
имеются две таблицы.
data(id integer, name varchar(255))
и
data_links(upid integer, downid integer)

Вложенность может быть как на 1 уровень, так и на несколько.

Пробую сделать рекурсивный запрос:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
WITH RECURSIVE tmp ( id, name, downid, upid ) AS (
SELECT d.id, d.name, d_l.downid, d_l.upid
    FROM data d
    join data_links d_l
    on d.id = d_l.upid
union
select d.id, d.name, d_l.downid, d_l.upid
from tmp t
join data_links d_l
on d_l.upid = t.downid
join data d
on d.id = d_l.downid
    
)
select tmp.* from tmp



Запрос работает, выводит все нормально.
Но мне требуется вернуть не все, а только данные самого верхнего уровня, и данные самого нижнего уровня
Получить в строку
data.id, data.name верхнего ууровня и data.id, data.name самого нижнего уровня
Данные верхнего уровня могут повторяться, так как одному значению верхнего уровня может соответствовать несколько значений самого нижнего уровня.
Как мне получить такие данные?
...
Рейтинг: 0 / 0
31.01.2019, 15:11
    #39767656
Hawkmoon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Рекурсивный запрос
Павел Гужанов,

Оконные
first_value(value any) same type as value returns value evaluated at the row that is the first row of the window frame
last_value(value any) same type as value returns value evaluated at the row that is the last row of the window frame
по результату рекурсии?
...
Рейтинг: 0 / 0
31.01.2019, 15:33
    #39767674
Павел Гужанов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Рекурсивный запрос
Попробовал такое:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
WITH RECURSIVE tmp ( id, name, downid, upid ) AS (
SELECT d.id, d.name, d_l.downid, d_l.upid
    FROM data d
    join data_links d_l
    on d.id = d_l.upid
union
select d.id, d.name, d_l.downid, d_l.upid
from tmp t
join data_links d_l
on d_l.upid = t.downid
join data d
on d.id = d_l.downid
    
)
select first_value(tmp.*) over (),  last_value(tmp.*) over () from tmp



вернулась одна строка, повторенная много раз.
У меня же верхнего уровня несколько записей. И каждой соответствуют несколько записей нижнего уровня
...
Рейтинг: 0 / 0
31.01.2019, 16:18
    #39767692
Hawkmoon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Рекурсивный запрос
окошко правильно задавать надо (скобочки во фразе over). Это не магическая кнопочка.
Думать и понимать должен ты, юный падаван.
Чтобы понять, что именно писать, нужно понять, что именно написано в рекурсии. Из описания и из рекурсивного SQL не следует ровным счетом ничего.

также first_value(*) попахивает карго-культом.

Вот тут вот примеры:
https://stackoverflow.com/questions/15721207/postgresql-how-should-i-use-first-value
и мозгами, либо подробную логику рекурсии в студию.
...
Рейтинг: 0 / 0
31.01.2019, 16:40
    #39767707
Павел Гужанов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Рекурсивный запрос
Подробная логика:
Таблица ссылается сама на себя через связывающую таблицу, по полю ID
Нужно получить ид и имя самого верхнего уровня, и ид и имя самого нижнего из вложенных уровней, промежуточные уровни не нужны
...
Рейтинг: 0 / 0
31.01.2019, 16:51
    #39767714
Swa111
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Рекурсивный запрос
Если не нужно соответствие Первый -> * -> Последний то достаточно такого запроса

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
    tOnlyUp as
     (select upid dataId from data_links --Все элементы на которые есть ссылка вверх
       except
      select downid from data_links -- и на них нет ссылки вниз
     ),
    tOnlyDown as 
     (select downid dataId from data_links 
       except
      select upid from data_links 
     ) tOnlyDown



если нужны только по цепочкам то скомбинируйте с Вашим рекурсивным запросом
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Рекурсивный запрос / 6 сообщений из 6, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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