楼主: 军长

[精华] 求数据库重新排序的语句,谢谢~

[复制链接]
论坛徽章:
117
ITPUB 11周年纪念徽章
日期:2012-10-09 18:03:322015年新春福章
日期:2015-03-04 14:19:11马上加薪
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有车
日期:2014-02-19 11:55:14比亚迪
日期:2013-09-18 09:31:09迷宫蛋
日期:2013-06-05 13:48:452013年新春福章
日期:2013-02-25 14:51:24
11#
发表于 2004-9-19 23:38 | 只看该作者
最初由 军长 发布
[B]结果还是不对,怪我没把问题一次性说清楚.实际使用的数据库有一百多万条,这个表20几列

1:ID列虽然是唯一的但由于有删除数据所以并不是简单的1的递增,中间有很多是跳过的ID.
2:上面的答复都没注意到一个重点,那就是ID只能用现有的ID来调换位置,不能用另外产生的系列替代,这个ID和其他表有对应关系的

有否其他的办法可以直接更新的?

PS:版主有QQ什么的吗?我远程开数据库给你看看你就知道了~ [/B]


呵呵,这斑竹值班的很好!
他的方法应该是对的,应该没什么问题的!
除非你的表大到完全不能在你的机器资源
限制下不能执行完!

我想你可能和我刚才的想法错在一样的吧!

使用道具 举报

回复
论坛徽章:
117
ITPUB 11周年纪念徽章
日期:2012-10-09 18:03:322015年新春福章
日期:2015-03-04 14:19:11马上加薪
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有车
日期:2014-02-19 11:55:14比亚迪
日期:2013-09-18 09:31:09迷宫蛋
日期:2013-06-05 13:48:452013年新春福章
日期:2013-02-25 14:51:24
12#
发表于 2004-9-19 23:45 | 只看该作者
最初由 军长 发布
[B]结果还是不对,怪我没把问题一次性说清楚.实际使用的数据库有一百多万条,这个表20几列

1:ID列虽然是唯一的但由于有删除数据所以并不是简单的1的递增,中间有很多是跳过的ID.
2:上面的答复都没注意到一个重点,那就是ID只能用现有的ID来调换位置而且要A列相同的ID才能互相调位置,不能用另外产生的系列替代,这个ID和其他表有对应关系的

有否其他的办法可以直接更新的?

PS:版主有QQ什么的吗?我远程开数据库给你看看你就知道了~ [/B]


调换怕什么,把你所有涉及到本表ID的地方全部
调换一变不就得了。“ID只能用现有的ID来调换
位置而且要A列相同的ID才能互相调位置”,我看
恐怕不行,因为你需要按另外条件排序,有没有
可能不能调换到的。所有的a列相同的一定按时间
排序都在一起吗?

其实我始终觉得你这个解决问题的思路不太对!
针对某问题,你想出了一个比较麻烦的技术上的
解决方法。

我觉得你应该把原来的问题说出来,为什么要这
样改?达到什么目的!

使用道具 举报

回复
论坛徽章:
22
授权会员
日期:2005-10-30 17:05:332012新春纪念徽章
日期:2012-02-13 15:11:362012新春纪念徽章
日期:2012-02-13 15:11:362012新春纪念徽章
日期:2012-02-13 15:11:362012新春纪念徽章
日期:2012-02-13 15:11:36马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:142012新春纪念徽章
日期:2012-02-13 15:11:36
13#
发表于 2004-9-19 23:55 | 只看该作者
这个ID和其他表有对应关系的?就是有主外键关联了,这个update起来就比较麻烦了。

你的id是identity属性的吗?用sp_help table_name可以看出来。

如果有不连续的id,用dbcc checkident(table_name,reseed,0)来重置id。然后就可以用我上面的语句了。

记得先备份数据库。

我想我明白你的意思了,直接的update我想想。今天有点晕,不好意思啦。

你用
http://www.itpub.net/showthread. ... 904&pagenumber=
这个帖子提供的工具将这个表生成insert语句,然后贴上来,我明天过来看,也给大家看看。这里高手很多。

使用道具 举报

回复
论坛徽章:
0
14#
 楼主| 发表于 2004-9-19 23:57 | 只看该作者
id是identity属性的,我可以停了程序去掉id的identity属性,update完再加改回去的.

PS:你明白我的意思太好了.正好我朋友一直催我去喝酒,一起去吗?明天等你的好消息,在此谢过

使用道具 举报

回复
论坛徽章:
59
马上加薪
日期:2014-02-19 11:55:142012新春纪念徽章
日期:2012-02-13 15:11:522012新春纪念徽章
日期:2012-01-04 11:49:54ITPUB十周年纪念徽章
日期:2011-11-01 16:19:41灰彻蛋
日期:2011-10-28 14:15:35管理团队成员
日期:2011-05-07 01:45:082011新春纪念徽章
日期:2011-02-18 11:43:332011新春纪念徽章
日期:2011-01-25 15:42:562011新春纪念徽章
日期:2011-01-25 15:42:332011新春纪念徽章
日期:2011-01-25 15:42:15
15#
发表于 2004-9-20 00:00 | 只看该作者
最初由 军长 发布
[B]结果还是不对,怪我没把问题一次性说清楚.实际使用的数据库有一百多万条,这个表20几列

1:ID列虽然是唯一的但由于有删除数据所以并不是简单的1的递增,中间有很多是跳过的ID.
2:上面的答复都没注意到一个重点,那就是ID只能用现有的ID来调换位置而且要A列相同的ID才能互相调位置,不能用另外产生的系列替代,这个ID和其他表有对应关系的

有否其他的办法可以直接更新的?

PS:版主有QQ什么的吗?我远程开数据库给你看看你就知道了~ [/B]

呵呵, 这下有点麻烦勒

不过还是有办法滴 , 另外半月的方法可能有问题如果ID不是随A增顺递增的话, 那么原来的顺序就乱了
再一点, 偶在解决方法中想传达一个思路, 这就是系统运用维护和开发略有不同, 因此, 偶认为应当随时建立工作表, 并在每一步骤上进行确认, 这样即便有问题, 也不会产生无法修复的结果
重新制订修复计划, 如后面的回答...........

使用道具 举报

回复
论坛徽章:
22
授权会员
日期:2005-10-30 17:05:332012新春纪念徽章
日期:2012-02-13 15:11:362012新春纪念徽章
日期:2012-02-13 15:11:362012新春纪念徽章
日期:2012-02-13 15:11:362012新春纪念徽章
日期:2012-02-13 15:11:36马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:142012新春纪念徽章
日期:2012-02-13 15:11:36
16#
发表于 2004-9-20 00:28 | 只看该作者
lodge兄,你上面的做法不行啊。id不连续的,用identity(int)就做不出来的。楼主要的是:ID只能用现有的ID来调换位置而且要A列相同的ID才能互相调位置

使用道具 举报

回复
论坛徽章:
59
马上加薪
日期:2014-02-19 11:55:142012新春纪念徽章
日期:2012-02-13 15:11:522012新春纪念徽章
日期:2012-01-04 11:49:54ITPUB十周年纪念徽章
日期:2011-11-01 16:19:41灰彻蛋
日期:2011-10-28 14:15:35管理团队成员
日期:2011-05-07 01:45:082011新春纪念徽章
日期:2011-02-18 11:43:332011新春纪念徽章
日期:2011-01-25 15:42:562011新春纪念徽章
日期:2011-01-25 15:42:332011新春纪念徽章
日期:2011-01-25 15:42:15
17#
发表于 2004-9-20 01:06 | 只看该作者
最初由 magicangel 发布
[B]lodge兄,你上面的做法不行啊。id不连续的,用identity(int)就做不出来的。楼主要的是:ID只能用现有的ID来调换位置而且要A列相同的ID才能互相调位置 [/B]


哦, 就是说, A中相同的数据不一定是连续的咯
恩, 调整一下就好了

1. 保留原顺序ID
SELECT IDENTIFY(INT) ORD, A, ID
INTO IDS
FROM SOURCE
ORDER BY A, ID;

2. 做B属性顺序表
SELECT IDENTIFY(INT) ORD, B
INTO ORDERB
FROM SOURCE
ORDER BY A, B;

3. 做成结果表
SELECT IDS.ID, ORDERB.A, ORDERB.B
INTO RESULT
FROM IDS, ORDERB
WHERE IDS.ORD=ORDERB.ORD;


4.确认结果正确性


5.清除错误数据
TRUNCATE SOURCE;

6.把结果移动到原表中
SELECT * INTO SOURCE
FROM RESULT;

7.清除中间表
DROP TABLE IDS;
DROP TABLE ORDERB;
DROP TABLE RESULT;

使用道具 举报

回复
论坛徽章:
0
18#
 楼主| 发表于 2004-9-20 04:46 | 只看该作者
酒喝多了,刚到家有点晕.明天起来再来测试~

我现在提交一下我的数据库的情况,实际上这是一个论坛的所有帖子内容的数据库.

一: A列相同表示是同一个主题的所有帖子,最小的ID表示帖子的主题,同时主题的ID会写入另一个代表所有主题帖子的主题表,同一主题贴(A列)的其他数据根据ID大小表示跟贴的顺序.如果重新生成ID,程序就会找不到对应的帖子.除非表示主题贴的表也重新生成.

二:目前我有几个数据是绝对准确的:
    1:表示同一主题贴的A列
  2:帖子的发表时间就是我说的B列
  3:表示所有主题贴的另一个表链接到这个表的所有主题贴,即同A列的最小ID,(现在使用的表部分最小的ID并不是主题贴,为什么导数据库会出现这种错误到目前为止还没闹明白 )

    现在你也应该知道我的要求是什么了

    ①根据这A,B列可以推出同一主题(A列)最早的发贴时间(B列)就是主题(ID),以后的是按时间(B列)排列的所有跟贴(注:程序设计的跟贴是Order by ID,并不是Order By B,虽然可以修改程序用发贴时间排序但是最好数据库的ID也重新排序)
        ②由于另一个主题表已经链接到主题ID所以要求表示主题的ID值不能变化否则程序会取不到帖子或取到错误的贴子.

唉,不知道我的表达有没清楚,晕~这些就是我提出该问题的实际原因~

使用道具 举报

回复
论坛徽章:
59
马上加薪
日期:2014-02-19 11:55:142012新春纪念徽章
日期:2012-02-13 15:11:522012新春纪念徽章
日期:2012-01-04 11:49:54ITPUB十周年纪念徽章
日期:2011-11-01 16:19:41灰彻蛋
日期:2011-10-28 14:15:35管理团队成员
日期:2011-05-07 01:45:082011新春纪念徽章
日期:2011-02-18 11:43:332011新春纪念徽章
日期:2011-01-25 15:42:562011新春纪念徽章
日期:2011-01-25 15:42:332011新春纪念徽章
日期:2011-01-25 15:42:15
19#
发表于 2004-9-20 08:02 | 只看该作者
恩, 在设计DB时, 赋予ID过多的含意了, 所以才会有麻烦, 如果增加一个顺序号来表示贴子的顺序, 用ID只是代表一个贴子的话, 应该好做一些.
单纯就解决本贴子的问题来说, 偶们现在在调整的表是整个系统的主表, 如果主表的主键发生变化了, 自然会影响到其它的表,
上面的方法, 也许可行但绝对不是安全的做法, 安全的做法是严格按照系统现有逻辑, 先重新生成主表ID, 然后, 按照现有逻辑重新做主题表, 这样才能够说修正的方法是绝对安全的, 也许这就是CCW同学所推崇的 简单就是美 的原则吧,

使用道具 举报

回复
论坛徽章:
105
萤石
日期:2014-04-06 09:24:42天枰座
日期:2015-07-22 11:25:542014年世界杯参赛球队: 阿尔及利亚
日期:2014-07-10 09:12:26马上加薪
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有车
日期:2014-02-19 11:55:14马上有车
日期:2014-02-18 16:41:112014年新春福章
日期:2014-02-18 16:41:11
20#
发表于 2004-9-20 09:12 | 只看该作者

军长的帖子在微软中文新闻组当中有人回了

[转贴] 来源:http://www.microsoft.com/China/c ... p;lang=zh&cr=CN
作者ICERIVER(林)
select (select count(*) from @a where a<=aa.a
and (a+cast(b as varchar(10)))<=(aa.a+cast(aa.b as varchar(10)))) AS ID,A,B
from        @a as aa
order by A asc, B desc
我觉得子查询中没有必要使用两个条件吧,第二个条件已经将a、b列联合考虑了。是不是?

使用道具 举报

回复

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

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表