2014-05-13 79 views
1

我有一個表,將其稱爲sach_temp,下面的示例數據。在from和value之間創建數字

TO_VALUE | FROM_VALUE | DATE_1 
---------+--------------+----------- 
200  | 100   | 2/13/2014 
238  | 234   | 2/13/2014 

,我想產生類似下面

VALUE | DATE_1 
    -------+--------------- 
100 | 2/13/2014 
101 | 2/13/2014 
102 | 2/13/2014 
103 | 2/13/2014 
. 
. 
200 | 2/13/2014 
234 | 2/13/2014 
. 
. 
238 | 2/13/2014 

我能想到的類似下面的輸出,但它會在表中只能工作單列。有人可以指導我如何處理這個問題嗎?

SELECT from_value+rownum-1 value, date_1 
    FROM 
    (SELECT  1 JUST_A_COL 
      FROM DUAL 
    CONNECT BY LEVEL <= (SELECT to_value-from_value+1 FROM sach_temp WHERE to_value=200)) a, 
    sach_temp b 
    WHERE to_value=200 

回答

1

說兩個值之間的最大差值爲500。然後,你可以通過創建數字的一張桌子,並使用join做到這一點。這裏有一個例子:

with nums as (
     select level as lvl from dual 
     connect by level < 500 
    ) 
select (st.from_value + n.lvl - 1) as value, st.date_1 
from sach_temp st join 
    nums n 
    on st.from_value + n.lvl - 1<= st.to_value; 

編輯:

您不必在最大值猜測。你可以計算出:

with vmax as (
     select max(to_value - from_value + 1) as vmax 
     from sach_temp 
    ), 
    nums as (
     select level as lvl from vmax 
     connect by level < vmax.vmax 
    ) 
select (st.from_value + n.lvl - 1) as value, st.date_1 
from sach_temp st join 
    nums n 
    on st.from_value + n.lvl - 1<= st.to_value; 
2

提供您的Oracle版本11g或更高版本,可以使用遞歸與子句和查詢很簡單:

with gen(max_num, min_num, value) as 
(
    select max_num, min_num, value from mytable 
    union all 
    select max_num, min_num + 1, value from gen where min_num < max_num 
) 
select min_num as num, value 
from gen 
order by min_num; 

SQL小提琴:http://www.sqlfiddle.com/#!4/fc2c4/3

+0

它實際上必須是「11g Release ** 2 **(又名11.2)或更高」。 11.1不支持遞歸CTE –

相關問題