我们先来看看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>

接下来我们看看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 );

后面想是否递归SQL也能实现, 测试、验证自己想法的时候,发现递归SQL并不适合这样的场景。上面方法应该算是最快的方法了。当然如果你有其它更好的方法,也请多多指教。
作者:潇湘隐者 出处:http://www.cnblogs.com/kerrycode/
如果你真心觉得文章写得不错,而且对你有所帮助,那就不妨小小打赏一下吧,如果囊中羞涩,不妨帮忙“推荐"一下,您的“推荐”和”打赏“将是我最大的写作动力!
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接. 好文要顶 关注我 收藏该文
潇湘隐者关注 - 149
粉丝 - 1914 荣誉:推荐博客 +加关注 0 0 ? 上一篇:Cannot execute as the database principal because the principal "guest" does not exist, this type of principal cannot be impersonated, or you do not have permission.
? 下一篇:VmWare平台Windows Server 2012 无响应宕机
SQL Challenge ——快速找到1-100之间缺失的数
标签:begin 查询 cannot exp alt com style 题目 str