SQL 获取连续编号中断号的最小值
2015-08-22 11:18
288 查看
问题描述;返回最小的缺失数,要求一定是正数. IF OBJECT_ID('dbo.T1') IS NOT NULL DROP TABLE dbo.T1; GO CREATE TABLE dbo.T1 ( keycol INT NOT NULL PRIMARY KEY CHECK(keycol > 0), datacol VARCHAR(10) NOT NULL ); INSERT INTO dbo.T1(keycol, datacol) VALUES(3, 'a'); INSERT INTO dbo.T1(keycol, datacol) VALUES(4, 'b'); INSERT INTO dbo.T1(keycol, datacol) VALUES(6, 'c'); INSERT INTO dbo.T1(keycol, datacol) VALUES(7, 'd'); --方法1:case when ....end select case when not exists(select * from T1 where keycol=1) then 1 else (select MIN(keycol) from T1 a where not exists(select * from T1 where keycol=a.keycol+1))+1 end --方法2;COALESCE(a,b)函数--具体翻MSDN吧 select coalesce(MIN(keycol+1),1) from T1 a where not exists(select * from T1 where keycol=a.keycol+1) and exists(select * from T1 where keycol=1)--这个EXISTS如果为NULL where 条件为假,那么MIN(KEYCOL+1)得到一个NULL,那么函数取第二个参数1 --方法3:临时表(这里的临时表产生方法我在后面会说,当然我之前第一次的学习笔记也有,有兴趣的可以去翻翻) select top 1 N from T1 right join NUM on T1.keycol=NUM.N--这里的NUN表是一个从1-1000000的表 where N<=(select MAX(keycol) from T1 ) and keycol is null --方法4:表之间的OUTER JOIN SELECT case when not exists(select * from T1 where keycol=1) then 1 else (select MIN(A.keycol + 1) FROM dbo.T1 AS A LEFT OUTER JOIN dbo.T1 AS B ON B.keycol = A.keycol + 1 WHERE B.keycol IS NULL)end
相关文章推荐
- Oracle第二弹--SQL语言概述
- MySQL必知必会(Create, Alter)
- Go操作mysql实现增删改查及连接池
- oracle存储结构
- /usr/bin/ld: cannot find -lmysqlclient_r
- 数据库索引的作用和优点缺点
- MySQL索引原理及慢查询优化
- 经典mysql语句
- Oracle的Flashback用法汇总
- 【Java EE 学习 28 上】【oracle学习第二天】【子查询】【集合运算】【几种数据库对象】
- sqlite建表语句(特别是外键问题)
- Oracle 截取指定长度的字符
- MySQL字符串函数
- Oracle 给字符串补空格、补0
- Redhat安装mysql及 导出数据库
- mysql 外键的记载
- 照片总结---选择适当的NoSQL
- Mysql 5.1升级为mysql 5.6遇到的问题及解决方式
- Mysql 5.1升级为mysql 5.6遇到的问题及解决方式
- PostgreSQL Replication之第九章 与pgpool一起工作(7)