zoukankan      html  css  js  c++  java
  • SQL Challenge ——快速找到1-100之间缺失的数

    有个经典的题目:1-100之间的数字(不重复)存放在表里,共95行一列,但是里面缺了5个数字,怎么用SQL最快找出那五个数字。

     

    我们先来看看Oracle数据库如何实现,如下所示,我们先准备测试环境和数据。

    SQL> create table t( id number(10));
     
    Table created.
     
    SQL> begin
      2   for i in 1 .. 100
      3   loop
      4     insert into t
      5     values(i);
      6   end loop;
      7   commit;
      8  end;
      9  /
     
    PL/SQL procedure successfully completed.
     
    SQL> delete from t where id in (13, 26,39,52,65);
     
    5 rows deleted.
     
    SQL> commit;
     
    Commit complete.
     
    SQL> 

    那么我们借助dba_objects这个视图(当然你借助其他表或视图都OK),生成1-100的自然数,然后和T表使用ANTI JOIN来得到查询结果。如下所示

    SQL> select rn from 
      2  ( select rownum as rn from dba_objects where rownum <=100) tt
      3   where tt.rn not in(select id from t);
     
            RN
    ----------
            65
            52
            13
            39
            26
     
    SQL> 

    clip_image001

     

     

    接下来我们看看SQL Server数据库如何实现,如下所示,我们先准备测试环境和数据。

    CREATE TABLE T ( ID  INT);
     
    DECLARE @Index INT =1;
     
    WHILE @Index <= 100
    BEGIN    
        INSERT INTO T VALUES(@Index);
        SET @Index +=1;
    END
    GO
     
    DELETE FROM T WHERE ID IN(13, 26,39,52,65);
    SELECT  RN
    FROM    ( SELECT    ROW_NUMBER() OVER ( ORDER BY object_id ) AS RN
              FROM      sys.objects
            ) TT
    WHERE   TT.RN <= 100
            AND TT.RN NOT IN ( SELECT   ID
                               FROM     T );

    clip_image002

     

    后面想是否递归SQL也能实现, 测试、验证自己想法的时候,发现递归SQL并不适合这样的场景。上面方法应该算是最快的方法了。当然如果你有其它更好的方法,也请多多指教。

  • 相关阅读:
    mysql主从复制+读写分离
    lnmp平台菜鸟入门级笔记
    Shell编程
    Shell编程之--“grep-awk-sed” 基础用法汇总
    Nginx
    LB负载均衡之Nginx-Proxy
    LB(Load balance)负载均衡集群-LVS
    HA(High available)-Keepalived高可用性集群(双机热备)单点实验
    HA(High available)--Heartbeat高可用性集群(双机热备)
    linux -小记(3) 问题:linux 安装epel扩展源报错
  • 原文地址:https://www.cnblogs.com/kerrycode/p/5974035.html
Copyright © 2011-2022 走看看