我会connect by level
像Stefan 所做的那样建议,但是,您不能在此语句中使用子查询,这意味着它并不适合您,因为您需要知道序列的最大值和最小值是什么.
我建议使用管道表函数可能是生成连接所需的数字的最佳方式。为了使其工作,您需要数据库中的一个对象将值返回到:
create or replace type t_num_array as table of number;
然后是函数:
create or replace function generate_serial_nos return t_num_array pipelined is
l_first number;
l_last number;
begin
select min(serial_no), max_serial_no)
into l_first, l_last
from my_table
;
for i in l_first .. l_last loop
pipe row(i);
end loop;
return;
end generate_serial_nos;
/
使用此函数,以下将返回一个序列号列表,介于最小值和最大值之间。
select * from table(generate_serial_nos);
这意味着您查找缺少哪些序列号的查询变为:
select serial_no
from ( select *
from table(generate_serial_nos)
) generator
left outer join my_table actual
on generator.column_value = actual.serial_no
where actual.serial_no is null