Коррелированный запрос на генерацию строк в Oracle - PullRequest
1 голос
/ 21 января 2011

С учетом этого начального 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 PRIOR и без дополнительного 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

И оригинальный вопрос остается в силе.

1 Ответ

0 голосов
/ 25 января 2011

Попробуйте:

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

...