【Oracle】利用level/Connect by 制作连续序列,并借此实现对缺失id的查找

摘要:
如果要在查询语句中创建某个区间的连续序列,可以这样做。其实到这里,只要把20换成待查字段的最低值,将100换成待查字段的最高值,再查哪些id在这里面没有,查缺失id的任务就解决了。createtabletestinsertintotestselectrownumfromdualconnectbyleveldeletefromtestwhereidin;已删除5行。以上实验的全程记录:SQL˃createtabletest;表已创建。SQL˃selectb.seqfrombwhereb.seqnotin;SEQ----------5791317参考资料:《OracleSQL疑难解析》P278人民邮电出版社出版。这本书直击要害,鞭辟入里,是我的Oracle书籍中最好的一本。

如果要在查询语句中创建某个区间的连续序列,可以这样做。

select seq from (select level as seq from dual connect by level<=100) a where a.seq>=20

生成的效果大家可以看一看:

SQL> select seq from (select level as seq from dual connect by level<=100) a where a.seq>=20;

       SEQ
----------
        20
        21
        22
        23
        24
        25
        26
        27
        28
        29
        30
       SEQ
----------
        31
        32
        33
        34
        35
        36
        37
        38
        39
        40
        41
       SEQ
----------
        42
        43
        44
        45
        46
        47
        48
        49
        50
        51
        52
       SEQ
----------
        53
        54
        55
        56
        57
        58
        59
        60
        61
        62
        63
       SEQ
----------
        64
        65
        66
        67
        68
        69
        70
        71
        72
        73
        74
       SEQ
----------
        75
        76
        77
        78
        79
        80
        81
        82
        83
        84
        85
       SEQ
----------
        86
        87
        88
        89
        90
        91
        92
        93
        94
        95
        96
       SEQ
----------
        97
        98
        99
       100
已选择81行。

其实到这里,只要把20换成待查字段的最低值,将100换成待查字段的最高值,再查哪些id在这里面没有,查缺失id的任务就解决了。

为实验完整起见,我们先创建一个只有id的test表。

create tabletest(
  id int,
  primary key(id))

insert intotest
select rownum fromdual
connect by level<21;

然后删掉一些数据:

SQL> delete from test where id in (5,7,9,13,17);

已删除5行。

SQL> commit;

提交完成。

SQL> delete from test where id<3;

已删除2行。

SQL> comomit;

这些,test表中id从3开始,中间缺5,7,9,13,17,看我们的sql能否把它们找出来。

select b.seq from (select seq from (select level as seq from dual connect by level<=(select max(id) from test)) a where a.seq>=(select min(id) from test)) b where b.seq not in (select id from test)

执行效果:

SQL> select b.seq from (select seq from (select level as seq from dual connect by level<=(select max(id) from test)) a where a.seq>=(select min(id) from test)) b where b.seq not in (select id fromtest);

       SEQ
----------
         5
         7
         9
        13
        17

确如预料。

以上实验的全程记录:

SQL> create tabletest(
  2    id int,
  3    primary key(id));

表已创建。

SQL> insert intotest
  2  select rownum fromdual
  3  connect by level<21;

已创建20行。

SQL> commit;

提交完成。

SQL> delete from test where id in (5,7,9,13,17);

已删除5行。

SQL> commit;

提交完成。

SQL> delete from test where id<3;

已删除2行。

SQL> commit;

提交完成。

SQL> select count(*) fromtest;

  COUNT(*)
----------
        13
SQL> select seq from (select level as seq from dual connect by level<=(select max(id) from test)) a where a.seq>=(select min(id) fromtest);

       SEQ
----------
         3
         4
         5
         6
         7
         8
         9
        10
        11
        12
        13
       SEQ
----------
        14
        15
        16
        17
        18
        19
        20
已选择18行。


SQL> select b.seq from (select seq from (select level as seq from dual connect by level<=(select max(id) from test)) a where a.seq>=(select min(id) from test)) b where b.seq not in (select id fromtest);

       SEQ
----------
         5
         7
         9
        13
        17

参考资料:《Oracle SQL疑难解析》P278(Grant Allen,Bob Bryla ,Darl Kuhn著)人民邮电出版社出版。这本书直击要害,鞭辟入里,是我的Oracle书籍中最好的一本。

-END-

免责声明:文章转载自《【Oracle】利用level/Connect by 制作连续序列,并借此实现对缺失id的查找》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇janusgraph的数据模型Nginx内存与磁盘资源的分配下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

unity shader 变种(多重编译 multi_compile)

一、定义 在unity中我们可以通过使用#pragma multi_compile或#pragma shader_feature指令来为shader创建多个稍微有点区别的shader变体。这个Shader被称为宏着色器(mega shader)或者超着色器(uber shader)。实现原理:根据不同的情况,使用不同的预处理器指令,来多次编译Shader代...

html 设置Select options值进行绑定

<select id="cdms"> <option value="">请选择...</option> <option value="0x00">高频整流</option>...

oracle 数据库复制

场景:      1、从OperateSystem用户下将数据库导入到新创建用户LsOperateSystem用户下,从Gsyl用户下将数据库导入到新创建用户LsZhmz用户下 创建命名空间和用户LsOperateSystem,并授权 create tablespace LsOperateSystem datafile 'E: ools ablespace...

mybatis 批量插入和where条件使用

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" > <mapper namespac...

SQL语句之语法汇总(一)

前段时间安装了sqlserver及management,编写了一些sql语句,现在对sql中常用的几个语法进行总结、分析与代码实例演示。 汇总一只介绍基本语法,较复杂的排序、分组等操作将在之后的文章中陆续总结! 一.创建表、修改表与删除表 1.1代码 1.创建表: create table Person5(Id int not null,Name nvar...

将Kafka收到的数据传入到redis中

首先得配置GateWay中的config.properties 然后再看一下TBox中的properties main方法中  Test中的config.properties  Test中 先启动网管(GateWay),再启动终端(TBox),然后再运行KafkaTest 启动TBox   在启动Test 可以看到 接收到数据了  然...