繁体   English   中英

在sql oracle中填写序列号

[英]Fill in sequence numbers in sql oracle

我有一个包含两列的表,这些列具有范围,即

 Batch  from _serial_no to_serial_no
 a  1   5
 b  2   7

我想创建另一列来分别填充abd b的空白

 Batch  from _serial_no to_serial_no    seq_number
 a  1   5   1
 a  1   5   2
 a  1   5   3
 a  1   5   4
 a  1   5   5
 b  2   7   2
 b  2   7   3
 b  2   7   4
 b  2   7   5
 b  2   7   6
 b  2   7   7

有可以使用的SQL吗?

我尝试了类似的方法,但是没有用

 select * 
 from ( 
      select a.*,rownum n   
      from my_table a connect by level <= TO_SERIAL_NO
 )  
 where n >= FROM_SERIAL_NO;
SQL> with
  2    data as (select 'a' batch, 1 from_serial_number, 5 to_serial_number from dual
  3             union all
  4             select 'b' batch, 2 from_serial_number, 7 to_serial_number from dual),
  5    seq as (select rownum n# from dual connect by level <= (select max(to_serial_number) from data))
  6  select
  7    data.*,
  8    seq.n#
  9  from
 10    data,
 11    seq
 12  where
 13    seq.n# between data.from_serial_number and data.to_serial_number
 14  order by
 15    1, 2, 4;

BATCH FROM_SERIAL_NUMBER TO_SERIAL_NUMBER         N#
----- ------------------ ---------------- ----------
a                      1                5          1
a                      1                5          2
a                      1                5          3
a                      1                5          4
a                      1                5          5
b                      2                7          2
b                      2                7          3
b                      2                7          4
b                      2                7          5
b                      2                7          6
b                      2                7          7

11 rows selected

另一个选择:

SQL> with test (batch, from_serial_no, to_serial_no) as
  2    (select 'a', 1, 5 from dual union
  3     select 'b', 2, 7 from dual
  4    )
  5  select
  6    batch,
  7    from_serial_no,
  8    to_serial_no,
  9    froM_serial_no + column_value - 1 seq_number
 10  from test,
 11       table(cast(multiset(select level from dual
 12                           connect by level <= to_serial_no - from_serial_no + 1
 13                          ) as sys.odcinumberlist))
 14  order by batch, seq_number;

B FROM_SERIAL_NO TO_SERIAL_NO SEQ_NUMBER
- -------------- ------------ ----------
a              1            5          1
a              1            5          2
a              1            5          3
a              1            5          4
a              1            5          5
b              2            7          2
b              2            7          3
b              2            7          4
b              2            7          5
b              2            7          6
b              2            7          7

11 rows selected.

SQL>

使用join

select d.*, t.seq_number
from data d
join
(
   SELECT  from_serial_no + level - 1 seq_number
   FROM    (select min(from_serial_no) from_serial_no, 
                   max(to_serial_no) to_serial_no 
            from data) t
   CONNECT BY from_serial_no + level - 1 <= to_serial_no
) t on d.from_serial_no <= t.seq_number and
       d.to_serial_no >= t.seq_number
order by d.batch, t.seq_number;

dbfiddle演示

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM