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并不适合这样的场景。上面方法应该算是最快的方法了。当然如果你有其它更好的方法,也请多多指教。

    作者:潇湘隐者

    如果你真心觉得文章写得不错,而且对你有所帮助,那就不妨小小打赏一下吧,如果囊中羞涩,不妨帮忙“推荐"一下,您的“推荐”和”打赏“将是我最大的写作动力!

    本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接.
  • 相关阅读:
    从hadoop框架与MapReduce模式中谈海量数据处理
    Hadoop
    Clone Graph
    Gas Station
    ZigZag Conversion
    String to Integer (atoi)
    Palindrome Number
    Container With Most Water
    Longest Common Prefix
    求和问题总结(leetcode 2Sum, 3Sum, 4Sum, K Sum)
  • 原文地址:https://www.cnblogs.com/wangchaoyuana/p/7545406.html
Copyright © 2011-2022 走看看