如何运用SQL语句进行断号查询并定位区间

作 者:
刘昆 

作者简介:
刘昆,武穴市审计局

原文出处:
审计月刊武汉

内容提要:


期刊代号:V3
分类名称:审计文摘
复印期号:2012 年 04 期

关 键 词:

字号:

      所谓断号查询。一般是指在一组或多组连续的流水号码中找出中间缺少的号码。在审计过程中,我们经常遇到这样的情况。比如税务机关的开票系统、医院的门诊收费系统、行政事业机关的非税收入管理系统等,除了正常作废导致断号之外。还有可能存在其他审计疑点。那么。怎样才能对断号全面查询并且精准定位呢?

      解决计算机问题。思路很重要:断号,就是在当前数据库的流水号中不存在的号码。同时这些号码又可以理解成当前数据库的流水号中某一个号码加1后得不到的号码。

      抽象的概念理解起来可能有些困难,让我们来看个例子:假如数据库中有30-80号票据,编号为30号的票据是第一份,那么我们从它开始,将其加1后为31号,如果查询到存在31号票据。那就证明编号30-31的税票是连续的。中间没有断号。那么,我们继续在编号31的基础上加1,成为编号32的票据,接着在数据库中查询其是否存在,如果发现在数据库中不存在这个编号。那么编号32的票据就是断号。并且32号就是这一个断号区间的起始值。

      接下来。我们检查大于这个起始值的最小号码(即终止值),定义出断号区间。接上例,32号是断号的起始,那么从32号起。可能存在一个或者多个号码在这个区间中,我们要做的是找出大于32号。并且最接近32号的这个号码。假如我们查询出的结果是34号,那么就证明32、33两个编号的税票不存在,断号终止值为33,断号区间就是32-33。

      最后,我们让数据库按照起始号、终止号的格式输出结果,即32,33,并保存到新的表格中去。至此,这一个完整的查询和定位过程结束。接下来就是循环执行直到整个数据库查询完毕。

      现在就让我们来用SQL语句来验证以上思路。验证之前我们需要建一张包含断号的简单数据表(表名example):

      CREATE TABLE

      example(ID INT)

      INSERT INTO example VALUES(10)

      INSERT INTO example VALUES(11)

      INSERT INTO example VALUES(12)

      INSERT INTO example VALUES(14)

      INSERT INTO example VALUES(15)

      INSERT INTO example VALUES(19)

      INSERT INTO example VALUES(20)

      可以看到这里面断号应该是13、16、17、18,SQL语句如下:

      SELECT起始号,(SELECT MIN(ID)-1 FROM example WHERE ID>起始号)AS终止号INTO断号分析及区间定位表FROM

      (SELECT ID+1 AS起始号FROM example WHERE ID+1 NOT IN(SELECT ID FROM example)and ID<(SELECT max(ID)FROM example))AS最大号ORDER BY起始号

      查询的结果生成了名为“断号分析及区间定位表”的表格,直观、准确无误(见下图)。

      

      经过对以上语句的理解和验证,我们达到了运用SQL语句进行断号查询并定位区间的目的。在实际工作中,我们按照以上语句的结构,稍作改动,然后对含有大量数据的数据库进行测试,发现是完全可行的(见下图)。

      

相关文章: