楼主: 军长

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

[复制链接]
论坛徽章:
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
31#
发表于 2004-9-21 16:23 | 只看该作者
假如你的announceid→id,rootid→a,dateandtime→b
那么应该这样写,将结果存放在#bbs这张临时表里:

select b.announceid,a.rootid,a.dateandtime into #bbs
from (select top 100000000 a.rootid,a.dateandtime,count(1) seq from bbs a,bbs b where a.rootid=b.rootid and a.dateandtime>=b.dateandtime group by a.rootid,a.dateandtime order by a.rootid,a.dateandtime desc) a,
(select top 100000000 a.announceid,a.rootid,count(1) seq from bbs a,bbs b where a.rootid=b.rootid and a.announceid>=b.announceid group by a.rootid,a.announceid order by a.rootid,a.announceid desc) b
where a.rootid=b.rootid and a.seq=b.seq

使用道具 举报

回复
论坛徽章:
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
32#
发表于 2004-9-21 16:32 | 只看该作者
你的记录有几百万条,执行上面的语句之前,先建个索引:
create clustered index ix_bbs on bbs(rootid)

这样可以优化执行效率

使用道具 举报

回复
论坛徽章:
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
33#
发表于 2004-9-21 16:33 | 只看该作者
然后你
select * from #bbs
可以看看结果对不对。

我现在等你告诉我。刚好空下来了一会。

使用道具 举报

回复
论坛徽章:
0
34#
 楼主| 发表于 2004-9-21 19:10 | 只看该作者
不好意思,刚下班回来.

你的语句测试通过,结果我也看了完全符合我的要求

现在怎么把这个结果写回bbs表?

使用道具 举报

回复
论坛徽章:
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
35#
发表于 2004-9-21 19:35 | 只看该作者
备份数据库。

alter table bbs nocheck constraint all --取消bbs所有的关联

delete bbs --清空bbs里的记录

insert bbs(announceid,rootid,dateandtime)
select announceid,rootid,dateandtime from #bbs --将临时表里的数据放回bbs表

alter table bbs check constraint all  --恢复关联

最后前台测试效果

使用道具 举报

回复
论坛徽章:
0
36#
 楼主| 发表于 2004-9-21 21:07 | 只看该作者
最初由 magicangel 发布
[B]备份数据库。

alter table bbs nocheck constraint all --取消bbs所有的关联

delete bbs --清空bbs里的记录

insert bbs(announceid,rootid,dateandtime)
select announceid,rootid,dateandtime from #bbs --将临时表里的数据放回bbs表

alter table bbs check constraint all  --恢复关联

最后前台测试效果 [/B]


你的命令不适合耶,我的表还有其他列,要怎么用临时表的对应记录替换bbs表的相应记录?

嘿嘿,作为数据库菜鸟第一次来这里就受到两大版主的鼎立相助.感动ing...

使用道具 举报

回复
论坛徽章:
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
37#
发表于 2004-9-21 21:19 | 只看该作者
最初由 军长 发布
[B]

你的命令不适合耶,我的表还有其他列,要怎么用临时表的对应记录替换bbs表的相应记录?

嘿嘿,作为数据库菜鸟第一次来这里就受到两大版主的鼎立相助.感动ing... [/B]


不客气。

lodge兄可是博士。

或者简单点的更改bbs表可以这么写,不作insert而是update:

update bbs set announceid=b.announceid
from bbs a,#bbs b
where a.rootid=b.rootid and a.dateandtime=b.dateandtime

使用道具 举报

回复
论坛徽章:
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
38#
发表于 2004-9-21 21:21 | 只看该作者
嗯,有其他列,就用update吧。

回到家,路上才想起来,不用那么复杂用insert。

使用道具 举报

回复
论坛徽章:
0
39#
 楼主| 发表于 2004-9-21 21:35 | 只看该作者
最初由 magicangel 发布
[B]

不客气。

lodge兄可是博士。

或者简单点的更改bbs表可以这么写,不作insert而是update:

update bbs set announceid=b.announceid
from bbs a,#bbs b
where a.rootid=b.rootid and a.dateandtime=b.dateandtime [/B]


啊,lodge了不起.博士还这么平易近人,一点都没架子,赞~

update应该没问题,不过我想会不会有极少量记录rootid和dateandtime会完全相同,不知这样会不会出错,还有update完,怎么把数据库按announceid重新排列?

使用道具 举报

回复
论坛徽章:
0
40#
 楼主| 发表于 2004-9-21 21:50 | 只看该作者
还有一问题,lodge的语句好像有点问题,我用你的命令更新完数据库,再执行lodge的统计排序错误指令,发现还有828条的记录排序不对
SELECT count(*)  FROM  bbs as a
WHERE EXISTS(SELECT NULL FROM  bbs as b WHERE a.rootid=b.rootid and a.announceid<b.announceid AND a.dateandtime>b.dateandtime)
--------------------------------------------------------------------
count    828
--------------------------------------------------------------------
然后我把这些数据取出来看,明明都是排序正确的,为什么?lodge的语句错了吗?

使用道具 举报

回复

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

本版积分规则 发表回复

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