SQL 自增列查询缺省值

天之饺子 2014-05-26 10:59:50
如 有表 KKK 数据是 :

ID为自增列~
id name
1 a
2 b
4 c
5 d
8 e
9 f
可以看出 缺少了 ID为 3,6,7 的数据
怎样在新增 的数据 g 时 找到最小的缺省ID 并组合成 3 'g' 插入到表中。
PS: ID不一定是数据库定义的自增列,可以只是用户主观上的定义。重点是如何找到缺省ID的值。
...全文
303 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
天之饺子 2014-05-26
  • 打赏
  • 举报
回复
引用 2 楼 xdashewan 的回复:
用自增列的目的,大多是为了即能设为主键提供索引查询,又可以免去每次插入的管理工作,既然楼主需要高精确度的数据,那自增列并不适合这项工作,而且楼主还需要自己维护一张表,用来维护缺省数值,当然可以用递归来找缺失,但如果数量很大,效率就不高
这是为了统一管理 因为我自增列是会显示的, 而且有被删除的可能,必须补上缺省的数值
xdashewan 2014-05-26
  • 打赏
  • 举报
回复
用自增列的目的,大多是为了即能设为主键提供索引查询,又可以免去每次插入的管理工作,既然楼主需要高精确度的数据,那自增列并不适合这项工作,而且楼主还需要自己维护一张表,用来维护缺省数值,当然可以用递归来找缺失,但如果数量很大,效率就不高
天之饺子 2014-05-26
  • 打赏
  • 举报
回复
有人会么,UP
天之饺子 2014-05-26
  • 打赏
  • 举报
回复
自己解决了 利用 row_number 函数可以解决 select a.rn from (SELECT ROW_NUMBER() over (order by id) rn FROM SysObjects) a where rn between (select MIN(id) from KKK) and (select MAX(id) from KKK) and rn not in (select ID from KKK)
天之饺子 2014-05-26
  • 打赏
  • 举报
回复
引用 4 楼 HEROWANG 的回复:
首先要把缺的号查出来,给你个列子,具体的自己写吧 --测试数据 CREATE TABLE tb(col1 varchar(10),col2 int) INSERT tb SELECT 'a',2 UNION ALL SELECT 'a',3 UNION ALL SELECT 'a',6 UNION ALL SELECT 'a',7 UNION ALL SELECT 'a',8 UNION ALL SELECT 'b',1 UNION ALL SELECT 'b',5 UNION ALL SELECT 'b',6 UNION ALL SELECT 'b',7 GO --缺号分布查询 SELECT a.col1,start_col2=a.col2+1, end_col2=( SELECT MIN(col2) FROM tb aa WHERE col1=a.col1 AND col2>a.col2 AND NOT EXISTS( SELECT * FROM tb WHERE col1=aa.col1 AND col2=aa.col2-1)) -1 FROM( SELECT col1,col2 FROM tb UNION ALL --为每组编号补充查询起始编号是否缺号的辅助记录 SELECT DISTINCT col1,0 FROM tb )a,(SELECT col1,col2=MAX(col2) FROM tb GROUP BY col1)b WHERE a.col1=b.col1 AND a.col2<b.col2 --过滤掉每组数据中,编号最大的记录 AND NOT EXISTS( SELECT * FROM tb WHERE col1=a.col1 AND col2=a.col2+1) ORDER BY a.col1,start_col2 /*--结果 col1 start_col2 end_col2 -------------- -------------- ----------- a 1 1 a 4 5 b 2 4
谢谢,也算学到另一种方法。
  • 打赏
  • 举报
回复
首先要把缺的号查出来,给你个列子,具体的自己写吧 --测试数据 CREATE TABLE tb(col1 varchar(10),col2 int) INSERT tb SELECT 'a',2 UNION ALL SELECT 'a',3 UNION ALL SELECT 'a',6 UNION ALL SELECT 'a',7 UNION ALL SELECT 'a',8 UNION ALL SELECT 'b',1 UNION ALL SELECT 'b',5 UNION ALL SELECT 'b',6 UNION ALL SELECT 'b',7 GO --缺号分布查询 SELECT a.col1,start_col2=a.col2+1, end_col2=( SELECT MIN(col2) FROM tb aa WHERE col1=a.col1 AND col2>a.col2 AND NOT EXISTS( SELECT * FROM tb WHERE col1=aa.col1 AND col2=aa.col2-1)) -1 FROM( SELECT col1,col2 FROM tb UNION ALL --为每组编号补充查询起始编号是否缺号的辅助记录 SELECT DISTINCT col1,0 FROM tb )a,(SELECT col1,col2=MAX(col2) FROM tb GROUP BY col1)b WHERE a.col1=b.col1 AND a.col2<b.col2 --过滤掉每组数据中,编号最大的记录 AND NOT EXISTS( SELECT * FROM tb WHERE col1=a.col1 AND col2=a.col2+1) ORDER BY a.col1,start_col2 /*--结果 col1 start_col2 end_col2 -------------- -------------- ----------- a 1 1 a 4 5 b 2 4

34,838

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧