在数据库里,这表名叫Member,这ID的字段名是Phone_ID(六位的char)。请问我该怎样做,才能得到最没出现过的、最小的数字呢?
(我的想法是用一个循环从000001开始搜索,直到找到没出现的数字,但这样做好像很愚蠢,有没有更好的方法呢?)
8 个解决方案
#1
不知道SQL中有没有查找最下数字的函数.
#2
大侠,不要走,救救我~~~~
#3
如果有这样的函数就好,没有的话不会要用排序法吧。
#4
这个不太好处理。
可有一种稍微聪明一些的方法:
建另一个表,只有一个字段,表名 Ids, 字段名 Phone_ID, 设成主关键字。
预先将000001到999999之间的全部数据存入该表中,共100万条,应该不算太大吧。
当用户输入的ID号重复而需要推荐新的编号时:执行下面的语句:
select top 1 Phone_ID from Ids left join member on Ids.Phone_ID = member.Phone_ID where member.Phone_ID is null order by Ids.Phone_ID
这样就可以找到没有使用的最小的ID了。
满意吗?给分吧。 :-)
可有一种稍微聪明一些的方法:
建另一个表,只有一个字段,表名 Ids, 字段名 Phone_ID, 设成主关键字。
预先将000001到999999之间的全部数据存入该表中,共100万条,应该不算太大吧。
当用户输入的ID号重复而需要推荐新的编号时:执行下面的语句:
select top 1 Phone_ID from Ids left join member on Ids.Phone_ID = member.Phone_ID where member.Phone_ID is null order by Ids.Phone_ID
这样就可以找到没有使用的最小的ID了。
满意吗?给分吧。 :-)
#5
在你的Phone_ID字段上建唯一索引,然后用你的循环方式查找。
这时你的查找其实是在索引上查找,因此速度极快。根本就不需要另外建表。
这时你的查找其实是在索引上查找,因此速度极快。根本就不需要另外建表。
#6
不过需要注意的是如果你的用户非常多并且频繁的执行增加和删除用户操作,则应该定期(比如每隔2个月)rebuild你的索引。
#7
select min(right('00000'+cast(cast(id as int)+1 as varchar(6)),6)) from Member a
where not exists (
select * from Member
where id=right('00000'+cast(cast(a.id as int)+1 as varchar(6)),6)
)
注:这是Yang_(扬帆破浪) 给的代码,我向尊敬的Yang_(扬帆破浪)鞠躬~~
大家这么热诚,分我还是照给的~~~
where not exists (
select * from Member
where id=right('00000'+cast(cast(a.id as int)+1 as varchar(6)),6)
)
注:这是Yang_(扬帆破浪) 给的代码,我向尊敬的Yang_(扬帆破浪)鞠躬~~
大家这么热诚,分我还是照给的~~~
#8
不错,学习,Yang_(扬帆破浪)是不是SQL版的斑竹呀?
#1
不知道SQL中有没有查找最下数字的函数.
#2
大侠,不要走,救救我~~~~
#3
如果有这样的函数就好,没有的话不会要用排序法吧。
#4
这个不太好处理。
可有一种稍微聪明一些的方法:
建另一个表,只有一个字段,表名 Ids, 字段名 Phone_ID, 设成主关键字。
预先将000001到999999之间的全部数据存入该表中,共100万条,应该不算太大吧。
当用户输入的ID号重复而需要推荐新的编号时:执行下面的语句:
select top 1 Phone_ID from Ids left join member on Ids.Phone_ID = member.Phone_ID where member.Phone_ID is null order by Ids.Phone_ID
这样就可以找到没有使用的最小的ID了。
满意吗?给分吧。 :-)
可有一种稍微聪明一些的方法:
建另一个表,只有一个字段,表名 Ids, 字段名 Phone_ID, 设成主关键字。
预先将000001到999999之间的全部数据存入该表中,共100万条,应该不算太大吧。
当用户输入的ID号重复而需要推荐新的编号时:执行下面的语句:
select top 1 Phone_ID from Ids left join member on Ids.Phone_ID = member.Phone_ID where member.Phone_ID is null order by Ids.Phone_ID
这样就可以找到没有使用的最小的ID了。
满意吗?给分吧。 :-)
#5
在你的Phone_ID字段上建唯一索引,然后用你的循环方式查找。
这时你的查找其实是在索引上查找,因此速度极快。根本就不需要另外建表。
这时你的查找其实是在索引上查找,因此速度极快。根本就不需要另外建表。
#6
不过需要注意的是如果你的用户非常多并且频繁的执行增加和删除用户操作,则应该定期(比如每隔2个月)rebuild你的索引。
#7
select min(right('00000'+cast(cast(id as int)+1 as varchar(6)),6)) from Member a
where not exists (
select * from Member
where id=right('00000'+cast(cast(a.id as int)+1 as varchar(6)),6)
)
注:这是Yang_(扬帆破浪) 给的代码,我向尊敬的Yang_(扬帆破浪)鞠躬~~
大家这么热诚,分我还是照给的~~~
where not exists (
select * from Member
where id=right('00000'+cast(cast(a.id as int)+1 as varchar(6)),6)
)
注:这是Yang_(扬帆破浪) 给的代码,我向尊敬的Yang_(扬帆破浪)鞠躬~~
大家这么热诚,分我还是照给的~~~
#8
不错,学习,Yang_(扬帆破浪)是不是SQL版的斑竹呀?