Sql 获取两列之间的数字列表
我在oracle中有一个table1startnumber,endnumber 现在我需要从表1中选择startnumber和endnumber之间的所有数字 数据Sql 获取两列之间的数字列表,sql,sql-server,oracle,Sql,Sql Server,Oracle,我在oracle中有一个table1startnumber,endnumber 现在我需要从表1中选择startnumber和endnumber之间的所有数字 数据 table1 startnumber endnumber 10 15 18 22 34 50 Now I need the result set as: 10,11,12,13,14,1
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
我该怎么做
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.
如果最低起始编号与最大结束编号相比相对较大,则可以更改CONNECT BY子查询,以生成从MINstartnumber到MAXENDNAME的编号,而不是从1到MAXENDNAME的编号,这应该更有效。如果希望值以逗号分隔,则可以这样做,或者在11gr2上使用逗号分隔 STARTNR SEQ 10,11,12,13,14,15 18 18,19,20,21,22 34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50
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;