ITPUB论坛-中国最专业的IT技术社区

 找回密码
 注册
查看: 2992|回复: 12

[讨论] SQL Order by 倒序排序问题

[复制链接]
论坛徽章:
0
发表于 2017-6-28 15:14 | 显示全部楼层 |阅读模式
问题是这样的。SQL中,设定的序列号号码快要用尽,想着程序中给加一位,又想照顾到旧的序列号查询时也能查询出来,所以我想旧数据不动,新的插入的数据位数比这前的数据多一位0(前面)序列号非全数据还有引导符用于区分,原序列号格式如(WP8912134),新生成的如(WP08912134),我原来查找序列号的方式用的Order by * desc的方式处理的,读最大的一个。但是现在读取的只能读取旧格式的最大的一个,新长度的读不出来,导致序列号异常。

哪 位大神帮帮忙。
语句非常简单,如下
select top 1 ID
from TABLE_ID
  order by ID desc
论坛徽章:
1
秀才
日期:2017-02-22 15:18:00
发表于 2017-6-28 15:42 | 显示全部楼层
还是你设计的问题,
1.SQL按字符排序 第3位为新加的0,而你原来的第3位为大于0的数字,理所当然排在你新加的前面,DESC
2.你所说的第3位新加入0 ,哪后面的又是按怎么样的逻辑生成?
3.如非要按你 这样取的话只能是先把前3位过滤出来再取最大的 条件加个lID ike N'WP0%'

使用道具 举报

回复
认证徽章
论坛徽章:
9
慢羊羊
日期:2015-03-04 14:55:272015年新春福章
日期:2015-03-06 11:59:47技术图书徽章
日期:2017-02-09 17:05:19秀才
日期:2017-02-22 15:16:26秀才
日期:2017-02-22 15:18:00现任管理团队成员
日期:2017-06-03 02:10:11版主1段
日期:2017-06-05 09:06:08秀才
日期:2017-08-18 11:04:35秀才
日期:2017-09-18 17:02:49
发表于 2017-6-28 16:22 | 显示全部楼层
这个问题比较有意思。可以说是一个典型的设计问题。临时的解决办法楼上已经说了,方法3就可以。
从根本上来说,这是一个设计问题。这个列的设计不能满足第一范式,即列不能够再分成其他几列。这里明显可以把这个列分成2列,type (WP),ID (8912134) 这个ID 可以用bigint存储,数据大的时候自动往前进一步。不会有号码用尽的问题.

使用道具 举报

回复
认证徽章
论坛徽章:
54
秀才
日期:2017-02-22 15:18:002015年新春福章
日期:2015-03-06 11:57:31懒羊羊
日期:2015-03-04 14:48:16马上有对象
日期:2014-10-24 17:37:55马上有车
日期:2014-02-18 16:41:112014年新春福章
日期:2014-02-18 16:41:11ITPUB社区12周年站庆徽章
日期:2013-10-08 15:00:34ITPUB社区12周年站庆徽章
日期:2013-10-08 14:57:28ITPUB社区12周年站庆徽章
日期:2013-10-08 14:54:39林肯
日期:2013-09-12 15:57:33
发表于 2017-6-29 07:13 | 显示全部楼层
如果可能,直接对所有数据补第3位为0是最简单的方案

使用道具 举报

回复
论坛徽章:
0
 楼主| 发表于 2017-6-29 10:09 | 显示全部楼层
luckyrandom 发表于 2017-6-29 07:13
如果可能,直接对所有数据补第3位为0是最简单的方案

我也想过补0的做法。但是程序其他地方改动不小的。不太想这样操作。所以想想SQL这方面有没有能解决的。

使用道具 举报

回复
论坛徽章:
0
 楼主| 发表于 2017-6-29 10:13 | 显示全部楼层
mssql_wangwang 发表于 2017-6-28 15:42
还是你设计的问题,
1.SQL按字符排序 第3位为新加的0,而你原来的第3位为大于0的数字,理所当然排在你新加 ...

这个当初刚做做法不成熟。不过用了好多年了,涉及方面太多。大改现在也不太可能了。后面的序列号也会加入0的,现在就是因为用DESC最top one 取不到的问题
。感谢给的办法,我试试。

使用道具 举报

回复
论坛徽章:
0
 楼主| 发表于 2017-6-29 10:16 | 显示全部楼层
owen_zeng 发表于 2017-6-28 16:22
这个问题比较有意思。可以说是一个典型的设计问题。临时的解决办法楼上已经说了,方法3就可以。
从根本上 ...

这个确实是当初刚开始做,考虑不足导致的。谢谢,给的分成2列的建议。

使用道具 举报

回复
认证徽章
论坛徽章:
9
慢羊羊
日期:2015-03-04 14:55:272015年新春福章
日期:2015-03-06 11:59:47技术图书徽章
日期:2017-02-09 17:05:19秀才
日期:2017-02-22 15:16:26秀才
日期:2017-02-22 15:18:00现任管理团队成员
日期:2017-06-03 02:10:11版主1段
日期:2017-06-05 09:06:08秀才
日期:2017-08-18 11:04:35秀才
日期:2017-09-18 17:02:49
发表于 2017-6-29 10:39 | 显示全部楼层
zheng04d1 发表于 2017-6-29 10:16
这个确实是当初刚开始做,考虑不足导致的。谢谢,给的分成2列的建议。

最后用了什么解决办法,和结果可以在这里分享下

使用道具 举报

回复
论坛徽章:
0
发表于 2017-7-3 09:38 | 显示全部楼层
可能把sql修改一下?
修改成:
select top 1 ID
from TABLE_ID
   order by length(ID) desc,ID desc
建一个复合索引

使用道具 举报

回复
认证徽章
论坛徽章:
9
慢羊羊
日期:2015-03-04 14:55:272015年新春福章
日期:2015-03-06 11:59:47技术图书徽章
日期:2017-02-09 17:05:19秀才
日期:2017-02-22 15:16:26秀才
日期:2017-02-22 15:18:00现任管理团队成员
日期:2017-06-03 02:10:11版主1段
日期:2017-06-05 09:06:08秀才
日期:2017-08-18 11:04:35秀才
日期:2017-09-18 17:02:49
发表于 2017-7-3 10:44 | 显示全部楼层
qiu_hong_yun 发表于 2017-7-3 09:38
可能把sql修改一下?
修改成:
select top 1 ID

是个不错的思路。不过需要对len(id)增加一个计算列,然后增加复合索引(length,id)

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则

SACC2017购票8.8折优惠进行时

2017中国系统架构师大会(SACC2017)将于10月19-21日在北京新云南皇冠假日酒店震撼来袭。今年,大会以“云智未来”为主题,云集国内外顶级专家,围绕云计算、人工智能、大数据、移动互联网、产业应用等热点领域展开技术探讨与交流。本届大会共设置2大主会场,18个技术专场;邀请来自互联网、金融、制造业、电商等多个领域,100余位技术专家及行业领袖来分享他们的经验;并将吸引4000+人次的系统运维、架构师及IT决策人士参会,为他们提供最具价值的交流平台。
----------------------------------------
优惠时间:2017年8月30日前

活动链接>>
TOP技术积分榜 社区积分榜 徽章 电子杂志 团队 统计 虎吧 老博客 知识索引树 读书频道 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档 | IT博客
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛 | SAP ERP系统
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 网站律师 隐私政策 知识产权声明
京ICP备16024965号 北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表