在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;