rownum和order by 的问题

[复制链接]
查看11 | 回复6 | 2010-7-21 15:14:22 | 显示全部楼层 |阅读模式
请教一个问题,为什么排序完之后再取rownum还是不正常?用row_number() over ()也一样


数据库为Oracle10g
下面两段代码取出的数据的顺序就不一样.请教原因.


测试语句:

create table TM
(
TM_ID VARCHAR2(32) not null,
TM_GROUP_ID VARCHAR2(32),
TM_CONTENTVARCHAR2(500) not null,
TM_TYPE_SET VARCHAR2(20),
TM_TIP_TYPE NUMBER(1),
TM_ORDERNUMBER(2)
);
----------------------------------------------------------------------------------
insert into TM (TM_ID, TM_GROUP_ID, TM_CONTENT, TM_TYPE_SET, TM_TIP_TYPE, TM_ORDER)
values ('E7F84088F2284C92BCB366550DC41031', 'GROUP22012736453792030', '11111111111111', '4000', 0, 0);
insert into TM (TM_ID, TM_GROUP_ID, TM_CONTENT, TM_TYPE_SET, TM_TIP_TYPE, TM_ORDER)
values ('B3A9C761C7BE4036A15EEF0ABC02CD17', 'GROUP22012736453792030', 'INTERNETBBBB22222', '4000', 0, 0);
insert into TM (TM_ID, TM_GROUP_ID, TM_CONTENT, TM_TYPE_SET, TM_TIP_TYPE, TM_ORDER)
values ('7D319925FFF14C9EA179E56D29AFA969', 'GROUP22012736453792030', 'MMSBBBB', '201', 0, 0);
insert into TM (TM_ID, TM_GROUP_ID, TM_CONTENT, TM_TYPE_SET, TM_TIP_TYPE, TM_ORDER)
values ('97368130B04B467F96FAA8D0EEBA86F3', 'GROUP22012736453792030', 'MMSAA', '201', 0, 0);
insert into TM (TM_ID, TM_GROUP_ID, TM_CONTENT, TM_TYPE_SET, TM_TIP_TYPE, TM_ORDER)
values ('DC10E8F040954096B1D7CA133C010D1E', 'GROUP22012736453792030', 'ffffffffff55555', '4000', 0, 0);
insert into TM (TM_ID, TM_GROUP_ID, TM_CONTENT, TM_TYPE_SET, TM_TIP_TYPE, TM_ORDER)
values ('357A380943FB47E2BF5D8622EDC5EF23', 'GROUP22012736453792030', 'sun1', '4000', 0, 0);
insert into TM (TM_ID, TM_GROUP_ID, TM_CONTENT, TM_TYPE_SET, TM_TIP_TYPE, TM_ORDER)
values ('417E694D9ED849F19B99A1CB569075DD', 'GROUP22012736453792030', 'sun2', '4000', 0, 0);
insert into TM (TM_ID, TM_GROUP_ID, TM_CONTENT, TM_TYPE_SET, TM_TIP_TYPE, TM_ORDER)
values ('C546B8C43016492CB71DA87C5B8AE771', 'GROUP22012736453792030', 'sun4', '4000', 0, 0);
insert into TM (TM_ID, TM_GROUP_ID, TM_CONTENT, TM_TYPE_SET, TM_TIP_TYPE, TM_ORDER)
values ('03FCD815DA044061A81146FCC82DC10E', 'GROUP22012736453792030', '', '201', 0, 0);
insert into TM (TM_ID, TM_GROUP_ID, TM_CONTENT, TM_TYPE_SET, TM_TIP_TYPE, TM_ORDER)
values ('69210E20A7B64BC9B8FF77397008C4E4', 'GROUP22012736453792030', 'jkkkkjhhjjh', '4000', 0, 0);
insert into TM (TM_ID, TM_GROUP_ID, TM_CONTENT, TM_TYPE_SET, TM_TIP_TYPE, TM_ORDER)
values ('773DA9EA65464A3D8A53BCF26FD5AB99', 'GROUP22012736453792030', 'hhhhhhhhhhhh', '4000', 0, 0);
insert into TM (TM_ID, TM_GROUP_ID, TM_CONTENT, TM_TYPE_SET, TM_TIP_TYPE, TM_ORDER)
values ('8D53C66CA9CB41CA81DB121E7668B40D', 'GROUP22012736453792030', 'dsunikmk', '4000', 0, 0);
insert into TM (TM_ID, TM_GROUP_ID, TM_CONTENT, TM_TYPE_SET, TM_TIP_TYPE, TM_ORDER)
values ('754730ED7B294C26B372444E87D4A6C6', 'GROUP22012736453792030', 'sun5', '4000', 0, 0);
insert into TM (TM_ID, TM_GROUP_ID, TM_CONTENT, TM_TYPE_SET, TM_TIP_TYPE, TM_ORDER)
values ('2C1D35D4426C47FEA188681346F8AB14', 'GROUP22012736453792030', 'sun6', '4000', 0, 0);
insert into TM (TM_ID, TM_GROUP_ID, TM_CONTENT, TM_TYPE_SET, TM_TIP_TYPE, TM_ORDER)
values ('11F138C6B3DF4C9B922772F1997F6462', 'GROUP22012736453792030', 'sun3', '4000', 0, 0);
insert into TM (TM_ID, TM_GROUP_ID, TM_CONTENT, TM_TYPE_SET, TM_TIP_TYPE, TM_ORDER)
values ('726B3765F73C43F69355F5C2A48F15EB', 'GROUP22012736453792030', 'ddddd', '4000', 0, 0);
commit;
-------------------------------------------------------------------------------
select * from (
select row_number() over (order by TM_TYPE_SET,TM_TIP_TYPE,TM_ORDER) no, tt.* from TM tt
)
where no 复制代码
回复

使用道具 举报

千问 | 2010-7-21 15:14:22 | 显示全部楼层
在我的数据库中查出的结果
R2TM_IDTM_GROUP_IDTM_CONTENTTM_TYPE_SETTM_TIP_TYPETM_ORDER
5357A380943FB47E2BF5D8622EDC5EF23GROUP22012736453792030sun1400000
6C546B8C43016492CB71DA87C5B8AE771GROUP22012736453792030sun4400000
7417E694D9ED849F19B99A1CB569075DDGROUP22012736453792030sun2400000
8DC10E8F040954096B1D7CA133C010D1EGROUP22012736453792030ffffffffff55555400000

R2TM_IDTM_GROUP_IDTM_CONTENTTM_TYPE_SETTM_TIP_TYPETM_ORDER
5357A380943FB47E2BF5D8622EDC5EF23GROUP22012736453792030sun1400000
669210E20A7B64BC9B8FF77397008C4E4GROUP22012736453792030jkkkkjhhjjh400000
7C546B8C43016492CB71DA87C5B8AE771GROUP22012736453792030sun4400000
8417E694D9ED849F19B99A1CB569075DDGROUP22012736453792030sun2400000
9DC10E8F040954096B1D7CA133C010D1EGROUP22012736453792030ffffffffff55555400000
回复

使用道具 举报

千问 | 2010-7-21 15:14:22 | 显示全部楼层
看了一下,order by TM_TYPE_SET,TM_TIP_TYPE,TM_ORDER有重复的,所以无法确定顺序的
回复

使用道具 举报

千问 | 2010-7-21 15:14:22 | 显示全部楼层
有重复很正常啊.这样分页时要加上主键之类的才行吧.
原来完全一条语句,结果也可以不同.
Oracle真是-_-!!!
明白了.多谢指教!
回复

使用道具 举报

千问 | 2010-7-21 15:14:22 | 显示全部楼层
加rowid,嘿嘿
回复

使用道具 举报

千问 | 2010-7-21 15:14:22 | 显示全部楼层
我原来遇到过oracle分页时,order by col1,如果col1不唯一,那么有的记录在第一页出现了,在后面又出现了,如果order by pk则没有这个问题,不知道大家遇到过没有。
回复

使用道具 举报

千问 | 2010-7-21 15:14:22 | 显示全部楼层
原帖由 lazyman2008 于 2010-5-28 18:29 发表
我原来遇到过oracle分页时,order by col1,如果col1不唯一,那么有的记录在第一页出现了,在后面又出现了,如果order by pk则没有这个问题,不知道大家遇到过没有。

这不就和LZ的一样,order by后面不唯一,oracle是不能确定顺序的,所以你必须让他唯一,真不行就加个rowid,这再也正常不过了!
回复

使用道具 举报

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

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行