Коррелированный запрос, генерирующий строки в Oracle

StackOverflow https://stackoverflow.com/questions/4754292

Вопрос

Учитывая этот стартовый 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, которое я использовал.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top