#sql #oracle #запрос
Есть необходимость из таблицы со столбцом: ID 1 3 6 8 9 11 23 ... получить таблицу: ID Res 1 1 3 1,3,1 6 1,3,6,3,1 8 1,3,6,8,6,3,1 9 1,3,6,8,9,8,6,3,1 11 1,3,6,8,9,11,9,8,6,3,1 Понимаю, что звучит бредово, но такие были поставлены условия: создать запрос без использования Model, аналитических функций, регулярных выражений, иерархических запросов и рекурсивного WITH. Есть ли какой-нибудь способ решить эту задачу при данных условиях? Очень прошу, если вы знаете (хотя бы примерно), как это можно сделать, поделиться методом или названиями функций, которые могут быть применены. P.S. PL/SQL не рассматривается
Ответы
Ответ 1
Перемножаем таблицу на саму себя, по такому условию, что бы к ID были выбраны все остальные, которые меньше его. После этого остается сгруппировать и собрать строку ID через запятую в нужном порядке (два раза, в прямом и обратном направлении): with Tab(ID) as( select 1 from DUAL union all select 3 from DUAL union all select 6 from DUAL union all select 8 from DUAL union all select 9 from DUAL union all select 11 from DUAL union all select 23 from DUAL ) select A.ID, trim(both ',' from LISTAGG(B.ID, ',') WITHIN GROUP (order by B.ID) || ',' || A.ID || ',' || LISTAGG(B.ID, ',') WITHIN GROUP (order by B.ID desc) ) from Tab A left join Tab B on B.ID < A.ID group by A.ID order by A.ID Тест на sqlfiddle.comОтвет 2
Похожий вариант, но с одним использованием listagg и без лишних запятых: select t.id, LISTAGG(q.id, ',') WITHIN GROUP (ORDER BY q.ord, q.id * q.ord2) from test t join ( select id, 1 ord, 1 ord2 from test union select id, 2, -1 ord2 from test ) q on t.id >= q.id and q.ord = 1 or t.id > q.id group by t.id order by t.id; SqlFiddle
Комментариев нет:
Отправить комментарий