#sql #oracle
#sql #Oracle
Вопрос:
Я пытаюсь понять, возможно ли создать представление Oracle SQL (например, без функции / процедуры), которое разбивает следующее на разные строки на основе начала и конца
Например.
------ ----------- ---------
| user | start_num | end_num |
------ ----------- ---------
| Bob | 87 | 98 |
| Sue | 55 | 64 |
------ ----------- ---------
Пример результата:
------ -----
| User | num |
------ -----
| Bob | 87 |
| Bob | 88 |
| Bob | 89 |
| Bob | 90 |
| Bob | 91 |
| Bob | 92 |
| Bob | 93 |
| Bob | 94 |
| Bob | 95 |
| Bob | 95 |
| Bob | 96 |
| Bob | 97 |
| Bob | 98 |
| Sue | 55 |
| Sue | 56 |
| Sue | 57 |
| Sue | 58 |
| Sue | 59 |
| Sue | 60 |
| Sue | 61 |
| Sue | 62 |
| Sue | 63 |
| Sue | 64 |
------ -----
Я рассматривал примеры подключения ПО уровням создания текущей последовательности чисел, но изо всех сил пытаюсь понять, будет ли это работать. И, может быть, есть гораздо более простой способ, который я упустил из виду?
Пример SQL для создания исходных данных:
with tab1 as
(select 'Bob' "user",87 "start_num", 98 "end_num" from dual
union
select 'Sue' "user",55 "start_num", 64 "end_num" from dual)
select * from tab1
Комментарии:
1. Какую версию Oracle вы используете? Так же, как информация, если> 12c есть просто способ использовать
lateral
для генерации того, что вы хотите.
Ответ №1:
Одним из методов является рекурсивный CTE:
with tab1 as (
select 'Bob' as usr, 87 as start_num, 98 as end_num from dual
union all
select 'Sue' as usr, 55 as start_num, 64 as end_num from dual
),
cte (usr, num, end_num) as (
select usr, start_num, end_num
from tab1
union all
select user, num 1, end_num
from cte
where num < end_num
)
select usr, num
from cte;
Вот скрипка db<> .