【问题标题】:how to find out missing number from seqentail numbers? [duplicate]如何从 seqentail 号码中找出缺失的号码? [复制]
【发布时间】:2014-02-16 12:35:13
【问题描述】:

我得到了 table1,其中包含 1 - 100 范围内的序列号 我想在不创建新表的情况下使用 pl 找出丢失的数字

我尝试过这种方式,但绝对不是专业的方式,而且 我试着用 选择 min_val.nextval 关键字,但我失败了,所以任何简单而专业的方法都可以做到这一点

declare 
min_val number(4);
max_val number(4);
current_val number(4);


cursor ids_cur is 
select ids from test1;

begin 

for ids_rec in ids_cur
loop
if min_val is not null then 
min_val:=min_val+1;
DBMS_OUTPUT.PUT_LINE(min_val);
else
DBMS_OUTPUT.PUT_LINE(min_val);

end if;
end loop;
end;

【问题讨论】:

  • 我阅读了 b4 帖子我正在寻找更优化的方式,我不想为我的序列创建表
  • 针对什么进行了优化?最快的速度方式是预先创建的表格,对于仅有 100 个值而没有明显计划更改范围的情况,其他方面的最佳解决方案,即最简单。
  • 大约有 200 万条记录我不想创建一个包含 200 万条 IDS 记录列表的表只是为了检查序号,它们分为 36 种类型,我使用正则表达式将它们分隔开来,并为那里的每种类型是捕获该序列号的不同方法,并且每种类型都有它自己的限制,例如 type1 的序列号限制在 1 到 9999 之间,所以我认为还有另一种方法可以做到这一点
  • 你说 0, 100,我是程序员,而不是千里眼……带有序列定义的表会给你一个机会在非递归 CTE 中创建一个范围,然后做一个外部加入其中 id 为空操作
  • 那是我朋友的例子

标签: oracle


【解决方案1】:

进行此类查询的最有效方法是使用select 语句而不是游标。基于集合的操作更快。这是一种使用递归 CTE 的方法:

with nums(n) as (
      select 1 as n from dual
      union all
      select n + 1
      from nums
      where n < 100
     )
select nums.n as MissingId
from nums left outer join
     test1
     on nums.n = test1.id
where test1.id is null;

这应该很容易概括为 9,999 个值。

如果您只想知道是否缺少数字,还有其他方法。

【讨论】:

  • 那会给我一个错误,因为没有 into 语句,因为我想在 pl 脚本中执行它,对吗?
  • @user3304876 。 . .您可以在此表达式上设置光标并逐一读出值。没关系——比在 PL/SQL 中执行逻辑要好。
【解决方案2】:

我想出了这个解决方案,但我收到错误消息,获取返回不止一行,但我正在从记录中读取游标??!

declare 
current_num number(4);

cursor c1 is 
select ids from test1;

 BEGIN

 for rec in c1 
 loop
select rownum into current_num from  all_objects  
   where  rownum<=(select max(ids) from  test1)  
   minus
   select ids
   from test1;

   DBMS_OUTPUT.PUT_LINE(current_num);
 end loop;
 END;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-24
    • 2017-03-03
    • 1970-01-01
    • 2015-11-28
    • 2017-07-10
    相关资源
    最近更新 更多