Получить список чисел между двумя столбцами с ключом - PullRequest
1 голос
/ 19 сентября 2011

Я хочу получить список чисел между двумя столбцами. Табличные значения будут использоваться для генерации большего количества строк.

например Таблица1:

Key StartNum EndNum
--- -------- ------
A   1        3
B   6        8

Мой вывод должен быть:

Key Num
--- ---
A   1
A   2
A   3
B   6
B   7
B   8

Я пытался это , но мне это не помогло (мне нужны строки с ключом).

Мне нужно решить эту проблему в Oracle 11g.

Ответы [ 4 ]

1 голос
/ 19 сентября 2011

a_horse_with_no_name-s решение будет

 SELECT distinct Key,(level + StartNum)-1 Num
   FROM Table1
  CONNECT BY (LEVEL +StartNum ) <= EndNum+1
  order by Key, Num

Вывод:

A   1                                     
A   2                                     
A   3                                     
B   6                                     
B   7                                     
B   8                                     

Но я бы предпочел создать глобальную временную таблицу и заполнить ее из plsql, так как приведенный выше метод содержитпоследующие decarts на столе (таким образом, отличное требуется).http://www.dba -oracle.com / t_temporary_tables_sql.htm

0 голосов
/ 19 сентября 2011

Это слегка адаптированная версия решения Джастина, размещенная в: получить список чисел между двумя столбцами

select key, num 
from (
  select distinct t1.key, t1.startnum + level - 1 num, t1.startnum, t1.endnum
  from table1 t1
  connect by level <= (select t2.endnum from table1 t2 where t1.key = t2.key)
) t
where num between t.startnum and t.endnum
order by key, num

Меня не устраивает необходимость distinct во внутреннем запросе, но в настоящее время у меня нет времени углубляться в это.

0 голосов
/ 19 сентября 2011

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

SELECT t.StartNum , t.StartNum , ROWNUM
FROM Table1 t , ALL_OBJECTS
WHERE ROWNUM between t.StartNum  and t.StartNum 
0 голосов
/ 19 сентября 2011

Создание процедуры хранения в транзакционном SQL

Create Procedure GetRangeFromTable 
As
Begin 

    create table #Result(           
            code varchar(50),
            num int
    )  

    Declare 
     @code varchar(50),
     @start int ,
     @end int

    DECLARE num_cursor CURSOR FOR Select * from Table1
    OPEN num_cursor

    FETCH NEXT FROM num_cursor 
    INTO @code, @start, @end


    WHILE @@FETCH_STATUS = 0
    BEGIN

        While @start <= @end
        Begin
            Insert into #Result(code,num) Values (@code,@start)
            Set @start= @start + 1
        End 

       FETCH NEXT FROM num_cursor 
       INTO @code, @start, @end

    END

    Select * from #Result

    CLOSE num_cursor
    DEALLOCATE num_cursor

End 
...