Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在sql oracle中填写序列号_Sql_Oracle_Sequence_Fill - Fatal编程技术网

在sql oracle中填写序列号

在sql oracle中填写序列号,sql,oracle,sequence,fill,Sql,Oracle,Sequence,Fill,我有一个包含两列的表,这些列有范围,即 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

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

 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;
还有一个选择:

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>
使用连接


谢谢!!!那真的很管用!!然而不幸的是,我的表在批处理列中不只有a和b,它有大约1000个不同的值,因此很难为批处理列合并所有可能的值。加上批处理值具有有效的重复项。您认为有没有办法将其整合到sql中;看一看我的答案:@ast对SO说谢谢的最好方式是将答案标记为正确;
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>
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;