2010-10-19 3 views
2

J'ai une table1 (startnumber, endnumber) dans oracle;obtenir la liste des nombres entre deux colonnes

Maintenant je dois sélectionner tous les numéros se trouve entre endNumber et de Numéro de départ table1

par exemple des données.

table1 
    startnumber  endnumber 
    10    15 
    18     22 
    34     50 

Now I need the result set as: 

10,11,12,13,14,15,18,19,20,21,22,34,35..... and so on 

Comment puis-je faire

Répondre

3

si vous vouliez les valeurs par des virgules que vous pourriez faire Séparées en tant que tel (ou si le 11gR2 utilisation listAgg)

WITH NUMS AS(
    SELECT 10 STARTNR , 15 ENDNR FROM DUAL UNION 
    SELECT 18 STARTNR , 22 ENDNR FROM DUAL UNION 
    SELECT 34 STARTNR , 50 ENDNR FROM DUAL)  , 
NUMSBETWEEN AS(
    SELECT distinct (level + startnr)-1 seq , startnr, endnr 
     FROM NUMS 
     CONNECT BY (LEVEL +STARTNR) <= ENDNR+1 
    ) 
SELECT startnr, 
     LTRIM(MAX(SYS_CONNECT_BY_PATH(seq,',')) 
     KEEP (DENSE_RANK LAST ORDER BY curr),',') AS seq 
FROM (SELECT startnr, 
       seq, 
       ROW_NUMBER() OVER (PARTITION BY startnr ORDER BY seq) AS curr, 
       ROW_NUMBER() OVER (PARTITION BY startnr ORDER BY seq) -1 AS prev 
     FROM numsBetween) 
GROUP BY startnr 
CONNECT BY prev = PRIOR curr AND startnr = PRIOR startnr 
START WITH CURR = 1; 

STARTNR SEQ


10 10,11,12,13,14,15
18 18,19,20,21,22
34 34,35,36,37,38,39,40,41, 42,43,44,45,46,47,48,49,50

2
SQL> ed 
Wrote file afiedt.buf 

    1 with t as (
    2 select 10 startnum, 15 endnum from dual 
    3 union all 
    4 select 18, 22 from dual 
    5 union all 
    6 select 34, 50 from dual 
    7 ) 
    8 select lvl 
    9 from (select level lvl 
10   from dual 
11   connect by level <= (select max(endnum) from t)) a 
12 where exists (select 1 
13     from t 
14*     where lvl between t.startnum and t.endnum) 
SQL>/

     LVL 
---------- 
     10 
     11 
     12 
     13 
     14 
     15 
     18 
     19 
     20 
     21 
     22 
     34 
     35 
     36 
     37 
     38 
     39 
     40 
     41 
     42 
     43 
     44 
     45 
     46 
     47 
     48 
     49 
     50 

28 rows selected. 

Si le numéro de départ le plus bas est relativement importante par rapport au nombre final maximum, vous pouvez changer le CONNECT BY sous-requête pour générer les numéros MIN (Numéro de départ) à MAX (endnumber) plutôt que de 1 à MAX (endnumber), ce qui devrait être plus efficace.

+0

Merci, sauveur de la vie – niceApp

Questions connexes