代码之家  ›  专栏  ›  技术社区  ›  Ast

在sql oracle中填写序号

  •  2
  • Ast  · 技术社区  · 7 年前

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

     Batch  from _serial_no to_serial_no
     a  1   5
     b  2   7
    

    我想创建另一列来分别填补a和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;
    
    3 回复  |  直到 6 年前
        1
  •  3
  •   Sanders the Softwarer    7 年前
    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
    
        2
  •  1
  •   Littlefoot    7 年前

    还有另一种选择:

    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>
    
        3
  •  1
  •   Radim Bača    7 年前

    使用 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 demo