2012-06-26 12 views
6

Ho questa tabella con i seguenti datirighe ripetute in base al valore della colonna in ogni riga



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

in base al valore nella colonna Ripeti per ogni riga, la riga deve essere ripetuto ancora una volta. Ad esempio per il processo 1, il valore di ripetizione è 2, quindi il processo 1 dovrebbe ripetersi altre due volte.

La tabella risultante deve essere il più seguito



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  

Qualcuno può aiutarmi con questa ricerca? am usando oracle 10g

risposta

7

Supponendo non sarà generare più di 1000 righe per riga:

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; 

Ecco un test: http://sqlfiddle.com/#!4/4519f/12

UPDATE: Come ha detto Jeffrey Kemp, è possibile "individuare" il massimo con una sottoquery:

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; 
+0

+1, inoltre è possibile sostituire '1000' con una sottoquery per trovare il valore massimo per la ripetizione. –

+0

voi ragazzi siete fantastici .. + 10..thanx .. – user991255

-1

Invece di eseguire questa manipolazione con la query, è possibile ottenere questi dati prima in una tabella di dati e aggiungere righe a una nuova tabella di dati in base al valore di ripetizione e quindi associare questa nuova tabella di dati.

7

Si potrebbe utilizzare una CTE ricorsiva:

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 

Live example at SQL Fiddle.

+0

Oracle ha introdotto solo CTE ricorsiva (AKA subquery factoring) a 11gR2. Purtroppo l'OP afferma che stanno usando 10 g. – APC

+0

+1 da parte mia. Comunque è una bella soluzione. –

+0

Grazie, sta funzionando alla grande. Però non capisco la CTE ricorsiva, ti sarei grato se potessi spiegarlo un po '. – Akbari

Problemi correlati