2011-01-21 7 views
1

Учитывая это, начиная КТР:Коррелированный ряд генерирующий запрос в Oracle

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 

Обратите внимание, что некоторые из значений в разделах КТР будут параметры, так что это не так просто, как расширение моих Союзов к правый номер.

UPDATE

Я думал об этом немного больше, и есть еще один ориентир. Я отвечу на любой ответ, но я надеюсь, что кто-то сможет показать, как это сделать с помощью 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 
) 

Но я отступаю от этого, потому что он может быть из таблицы, а не из DUAL. Итак, давайте предположим Разделы КТР по сути простой запрос из таблицы, что-то вроде:

SELECT Section, StartUnit, EndUnit FROM SectionData WHERE CallerID = 7 

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

ответ

0

Попробуйте это:

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 я использовал.

+0

Спасибо за ответ. Можете ли вы придумать любой способ сделать это без вмешательства CTE, возможно, используя CONNECT BY PRIOR или что-то еще? – ErikE

+0

Нет, я не могу, извините. –

+0

Хорошо, спасибо за попытку. – ErikE