Коррелированный запрос, генерирующий строки в Oracle
-
15-10-2019 - |
Вопрос
Учитывая этот стартовый CTE:
WITH Sections AS (
SELECT 1 Section, 1 StartUnit, 5 EndUnit FROM DUAL
UNION ALL SELECT 2, 0, 2 FROM DUAL
UNION ALL SELECT 3, 1, 1 FROM DUAL
),
Как я могу генерировать набор результатов, в котором в разделе есть столько строк на строку, сколько и чисел между startUnit и endunit (включительно), с поднимающимися значениями?
То есть я хотел бы увидеть набор результатов:
Section Unit
1 1
1 2
1 3
1 4
1 5
2 0
2 1
2 2
3 1
Обратите внимание, что некоторые из значений в разделах CTE будут параметрами, поэтому это не так просто, как расширение моих профсоюзов до нужного числа.
ОБНОВИТЬ
Я подумал об этом немного больше и у меня есть еще одно руководство. Я возьму любой ответ, который правильный, но особенно надеялся, что кто -то, возможно, покажет, как сделать это с помощью Connect By Pror и без дополнительного CTE в середине ...
Я понял, что могу изменить CTE на это:
WITH Sections AS (
SELECT 1 Section, LEVEL Unit FROM DUAL CONNECT BY LEVEL <= 5
UNION ALL SELECT 2, LEVEL - 1 FROM DUAL CONNECT BY LEVEL <= 3
UNION ALL SELECT 3, 1 FROM DUAL CONNECT BY LEVEL <= 1
)
Но я склоняюсь от этого здесь, потому что это может исходить из стола, а не быть выбранным из двойного. Итак, давайте предположим, что разделы CTE на самом деле является простым запросом из таблицы, что -то вроде:
SELECT Section, StartUnit, EndUnit FROM SectionData WHERE CallerID = 7
И первоначальный вопрос все еще стоит.
Решение
Попробуй это:
WITH Sections AS (
SELECT 1 Section, 1 StartUnit, 5 EndUnit FROM DUAL
UNION ALL SELECT 2, 0, 2 FROM DUAL
UNION ALL SELECT 3, 1, 1 FROM DUAL
),
Numbers AS (
SELECT ROWNUM-1 n
FROM DUAL
CONNECT BY LEVEL < 1000
)
select section, n
from sections, numbers
where n between startunit and endunit
order by section, n;
Вы можете настроить значение 1000, которое я использовал.