免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 12962 | 回复: 54
打印 上一主题 下一主题

求数据库重新排序的语句,谢谢~ [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-09-18 02:58 |只看该作者 |倒序浏览
原数据库     排序后结果
ID  A  B    ID  A   B  
---------  ------------
1   a  4    3   a   4
2   a  3    2   a   3
3   a  2    1   a   2
4   b  5    5   b   5
5   b  1    4   b   1
6   c  7    7   c   7
7   c  6    6   c   6
8   c  8    8   c   8

字段定义: ID  int(4)   A   int(4)    B datetime(   

要求就是把A列相同的数据根据B列时间的先后重新排列ID列,由于ID是唯一的因此只能在相同的A组里面互相调换ID而不能改变ID的值.

请教这样的语句该如何写?最好给出一个脚本直接Update原数据库,谢谢~

论坛徽章:
0
2 [报告]
发表于 2004-09-18 14:21 |只看该作者
搞不明白为什么要重新排列ID列,实际中的问题我看
完全不需要通过这样技术手段来解决:你完全可以在
加一个字段,来达到你目前所说的目的,或许对你具
体问题,还有更好的技术上的处理方法,是不是?

论坛徽章:
0
3 [报告]
发表于 2004-09-18 23:25 |只看该作者
谢谢楼上的回复,可是程序是已经编好的,我是从acc转到sql运行一段时间才发现的问题,现在已经无法重新转数据库了,而且很多关系表是链接在一起的,如果不重新排序出来的结果就完全不对了,有一百多万的条的数据都需要找出这类错误并重新排序,各位有好招支一声,看过就不要错过,这事挺急的~谢谢!

论坛徽章:
0
4 [报告]
发表于 2004-09-19 09:04 |只看该作者
恩, 把原表的数据排好顺序后, 从新取ID保存到一个新表里, 然后清空原表, 利用中间表排好顺序的结果重新做原表, 比更新原表要容易很多, 另外, 既然是一次性手动更新, 偶就不太多考虑, 代码简洁效率这样的问题了, 要做几次中间表, 如果发生操作错误, 也可以再从正确的一步重新做

1. 做A属性顺序表
SELECT DISTNCT MIN(ID) ID, A
INTO ORDERA
FROM SOURCE
GROUP BY A;

2. 为A属性添加 B列
SELECT ORDERA.ID, ORDERA.A, SOURCE.B
INTO ORDERB
FROM ORDERA, SOURCE
WHERE ORDERA.A=SOURCE.A

3. 重新排序, 把结果保存到中间表中
SELECT IDENTIFY(1,1), A, B INTO RESULT
FROM ORDERB
ORDER BY ID, B DESC;

4.确认结果正确性
4.1 确认是否存在丢失记录
SELECT * FROM SOURCE
WHERE NOT EXISTS(SELECT NULL FROM RESULT
WHERE RESULT.A=SOURCE.A AND RESULT.B=SOURCE.B)
4.2 确认是否存在多余记录
SELECT * FROM RESULT
WHERE NOT EXISTS(SELECT NULL FROM SOURCE
WHERE RESULT.A=SOURCE.A AND RESULT.B=SOURCE.B)
4.3 确认记录总数
SELECT COUNT(*) FROM SOURCE
SELECT COUNT(*) FROM RESULT
4.4 顺序的正确性
SELECT * FROM RESULT T1
WHERE EXISTS(SELECT NULL FROM RESULT T2
WHERE T1.ID > T2.ID AND T1.B<T2.B)
* 如认为有必要, 还可以考虑做更细致的确认

5.清除错误数据
TRUNCATE SOURCE

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

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

8. 完成任务, FB一下
:bye:

论坛徽章:
0
5 [报告]
发表于 2004-09-19 15:40 |只看该作者
在这我先谢过\'肥肥猫\',写的很详细,特别适合我这种新手
我现在就先用备份数据库测试一下,有结果我会再来回复这个贴子的.感动ing...

论坛徽章:
0
6 [报告]
发表于 2004-09-19 15:52 |只看该作者
肥猫猫还在吗?我已经加了你的MSN了,可以当面咨询一下吗?有些语句在我的MSSQL通不过~
我的MSN:zplzg@msn.com QQ:36456

论坛徽章:
0
7 [报告]
发表于 2004-09-19 23:17 |只看该作者
select 1 id,\'a\' a,4 b
into #magic
union
select 2,\'a\',3
union
select 3,\'a\',2
union
select 4,\'b\',5
union
select 5,\'b\',1
union
select 6,\'c\',7
union
select 7,\'c\',6
union
select 8,\'c\',8

select identity(int) id,a,b into #tmp from #magic order by a,b

--------------------------------------------------------------------------------------

#tmp表里就是你要的结果。

--------------------------------------------------------------------------------------

还有一种是这样的需求:
select a.id,a.a,a.b ,count(1) seq
from #magic a,#magic b
where a.a=b.a and a.b>=b.b
group by a.id,a.a,a.b

论坛徽章:
0
8 [报告]
发表于 2004-09-19 23:27 |只看该作者
最初由 magicangel 发布
[B]select 1 id,\'a\' a,4 b
into #magic
union
select 2,\'a\',3
union
select 3,\'a\',2
union
select 4,\'b\',5
union
select 5,\'b\',1
union
select 6,\'c\',7
union
select 7,\'c\',6
union
select 8,\'c\',8

select identity(int) id,a,b into #tmp from #magic order by a,b

--------------------------------------------------------------------------------------

#tmp表里就是你要的结果。

--------------------------------------------------------------------------------------

还有一种是这样的需求:
select a.id,a.a,a.b ,count(1) seq
from #magic a,#magic b
where a.a=b.a and a.b>=b.b
group by a.id,a.a,a.b [/B]



发觉你的一个特点,喜欢用union!
不过你这个好像不能解决他的问题?

靠,错误的理解了你的意思了,
原来union是这个意思,放在查询分析
器中用了一下,原来如此!

呵呵,学了一小招!!!!!

论坛徽章:
0
9 [报告]
发表于 2004-09-19 23:28 |只看该作者
最初由 cowherd 发布
[B]


发觉你的一个特点,喜欢用union!
不过你这个好像不能解决他的问题? [/B]


嗯,这样建表简便啊。:lovely:

应该可以的,你看看结果,然后告诉我不可以在哪里好吗?

论坛徽章:
0
10 [报告]
发表于 2004-09-19 23:29 |只看该作者
结果还是不对,怪我没把问题一次性说清楚.实际使用的数据库有一百多万条,这个表20几列

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

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

PS:版主有QQ什么的吗?我远程开数据库给你看看你就知道了~
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP