如何检查一系列数字中的任何缺失数字?

Sam*_*der 23 sql oracle plsql gaps-and-islands

我正在做一个为大学创建录取系统的项目; 这些技术是Java和Oracle.

在其中一个表中,存储了预先生成的序列号.之后,根据这些序列号,将输入申请人的表格数据.我的要求是,当输入过程完成后,我将不得不生成一个明智的报告.如果在喂食预先生成的序列号期间,任何序列号都会丢失.

例如,在表格中,序列号是7001,7002,7004,7005,7006,7010.从上面的系列可以清楚地看出,从7001到7010,缺失的数字是7003,7007,7008和7009.

Oracle中是否有任何DBMS功能可以找出这些数字,或者如果任何存储过程可能满足我的目的,请建议一个算法.

我可以在Java中找到一些技术,但为了提高速度,我想在Oracle中找到解决方案.

Rob*_*ijk 43

没有硬编码9的解决方案:

select min_a - 1 + level
     from ( select min(a) min_a
                 , max(a) max_a
              from test1
          )
  connect by level <= max_a - min_a + 1
    minus
   select a
     from test1
Run Code Online (Sandbox Code Playgroud)

结果:

MIN_A-1+LEVEL
-------------
         7003
         7007
         7008
         7009

4 rows selected.
Run Code Online (Sandbox Code Playgroud)

  • 这让我的回答看起来过于复杂!+1 (6认同)

Pat*_*ick 13

试试这个:

SELECT t1.SequenceNumber + 1 AS "From",
       MIN(t2.SequenceNumber) - 1 AS "To"
FROM MyTable t1
JOIN MyTable t2 ON t1.SequenceNumber < t2.SequenceNumber 
GROUP BY t1.SequenceNumber
HAVING t1.SequenceNumber + 1 < MIN(t2.SequenceNumber)
Run Code Online (Sandbox Code Playgroud)

以下是序列7001,7002,7004,7005,7006,7010的结果:

From  To
7003  7003
7007  7009
Run Code Online (Sandbox Code Playgroud)