powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Рекурсивный запрос
6 сообщений из 6, страница 1 из 1
Рекурсивный запрос
    #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
Рекурсивный запрос
    #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
Рекурсивный запрос
    #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
Рекурсивный запрос
    #39767692
Hawkmoon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
окошко правильно задавать надо (скобочки во фразе over). Это не магическая кнопочка.
Думать и понимать должен ты, юный падаван.
Чтобы понять, что именно писать, нужно понять, что именно написано в рекурсии. Из описания и из рекурсивного SQL не следует ровным счетом ничего.

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

Вот тут вот примеры:
https://stackoverflow.com/questions/15721207/postgresql-how-should-i-use-first-value
и мозгами, либо подробную логику рекурсии в студию.
...
Рейтинг: 0 / 0
Рекурсивный запрос
    #39767707
Павел Гужанов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подробная логика:
Таблица ссылается сама на себя через связывающую таблицу, по полю ID
Нужно получить ид и имя самого верхнего уровня, и ид и имя самого нижнего из вложенных уровней, промежуточные уровни не нужны
...
Рейтинг: 0 / 0
Рекурсивный запрос
    #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
6 сообщений из 6, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Рекурсивный запрос
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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