9

私はこのテーブルに次のデータを入れました



Job  Quantity   Status  Repeat 
1    100         OK     2 
2    400         HOLD   0 
3    200         HOLD   1 
4    450         OK     3 

各行の[繰り返し]列の値に基づいて、その行をもう一度繰り返す必要があります。たとえば、ジョブ1の場合、繰り返し値は2であるため、ジョブ1はさらに2回繰り返す必要があります。

結果のテーブルは次のようになります



Job      Quantity   Status  Repeat 
1        100        OK      2 
1        100        OK      2 
1        100        OK      2 
2        400        HOLD    0 
3        200        HOLD    1 
3        200        HOLD    1 
4        450        OK      3 
4        450        OK      3 
4        450        OK      3 
4        450        OK      3 

誰かがこのクエリで私を助けてくれますか?オラクル10gを使用しています

4

3 に答える 3

10

再帰CTEを使用できます。

with    cte(Job, Repeat, i) as 
        (
        select  Job
        ,       Repeat
        ,       0
        from    YourTable
        union all
        select  Job
        ,       Repeat
        ,       i + 1
        from    cte
        where   cte.i < cte.Repeat
        )
select  *
from    cte
order by
        Job
,       i

SQLFiddleでの実例。

于 2012-06-26T05:51:49.800 に答える
7

行ごとに1000行を超えて生成しないと仮定します。

with num as (select level as rnk from dual connect by level<=1000)
select Job,  Quantity,   Status,  Repeat, rnk 
from t join num on ( num.rnk <= repeat )
order by job, rnk;

テストは次のとおりです: http ://sqlfiddle.com/#!4/4519f / 12

更新: Jeffrey Kempが言ったように、サブクエリで最大値を「検出」できます。

with num as (select level as rnk 
             from dual 
             connect by level<=(select max(repeat) from t)
             )
select job,  quantity,   status,  repeat, rnk 
from t join num on ( num.rnk <= repeat )
order by job, rnk;
于 2012-06-26T06:06:15.910 に答える
-2

クエリでこの操作を行う代わりに、最初にデータテーブルでこのデータを取得し、repeatの値に基づいて新しいデータテーブルに行を追加してから、この新しいデータテーブルをバインドできます。

于 2012-06-26T05:41:49.147 に答える