关于ROWNUM和ORDER BY的问题
前两天同事发现网站上同一个商品在几页里都出现,然后查语句,发现有诡异的事情,原来以为可能是物化视图的关系,不过今天我测试了下,是和ORDER BY 里出现并列数据有关
先举例说明下
SELECT a.*,rownum FROM (SELECT good_id, good_nm, prc FROM tb_ag001 ORDER BY prc) a
SELECT * FROM (SELECT good_id, good_nm, prc FROM tb_ag001 ORDER BY prc) WHERE ROWNUM <9
SELECT * FROM (SELECT good_id, good_nm, prc FROM tb_ag001 ORDER BY prc) WHERE ROWNUM <= 8
SELECT * FROM (SELECT a.*, ROWNUM rn FROM (SELECT good_id, good_nm, prc FROM tb_ag001 ORDER BY prc) a) WHERE rn < 9
SELECT *FROM ( SELECT a.*, ROWNUM rn FROM (SELECT good_id, good_nm, prc FROM tb_ag001 ORDER BY prc --第一层,这是where条件层,这是必须的,这个时候取的是基本数据。 ) a --第二层,在原来的结果集上进行列表,排需要,记录所有的rownum,以便于分页的时候取数据 )b --第三层,真正的分页取数据层,想取第几页就取第几页。 WHERE b.rn < 9
[解决办法]
顶
[解决办法]
16:29:53 scott@TUNGKONG> SELECT a.*,rownum FROM (SELECT good_id, good_nm, prc FROM tb_ag001 ORDER BY prc) a;GOOD_I GOOD_NM PRC ROWNUM------ ------------------------------ ---------- ----------133337 阳光宝贝防晒修复套SPF-30 0 1133424 旋覆透白绣花毛巾X1 0 2133428 左旋C新纪润白霜(7ml) 0 3133430 左旋C美白保湿精乳 0 4133528 美白晶澈爽肤水 0 5133530 左旋C燕窝初雪调养面膜 0 6133628 左旋C-燕窝初雪调养面膜8g*2 0 7133728 化妆包1个 0 8133828 BICATO活菌酵母修护晚霜5g 0 9138068 蓝牙耳机*1128TF卡*1 0 10138069 超速读卡器*1 0 11138073 内置128兆TF卡天然水晶手链*1 0 12138074 内置128兆TF卡水晶手链 0 13已选择13行。已用时间: 00: 00: 00.0016:30:06 scott@TUNGKONG> SELECT * FROM (SELECT a.*, ROWNUM rn FROM (SELECT good_id, good_nm, prc FROM tb_ag001 ORDER BY prc) a) WHERE rn < 9;GOOD_I GOOD_NM PRC RN------ ------------------------------ ---------- ----------133337 阳光宝贝防晒修复套SPF-30 0 1133424 旋覆透白绣花毛巾X1 0 2133428 左旋C新纪润白霜(7ml) 0 3133430 左旋C美白保湿精乳 0 4133528 美白晶澈爽肤水 0 5133530 左旋C燕窝初雪调养面膜 0 6133628 左旋C-燕窝初雪调养面膜8g*2 0 7133728 化妆包1个 0 8已选择8行。 -----------------这是正确的结果,因为后面的过滤条件用的是rn < 9。已用时间: 00: 00: 00.0116:30:21 scott@TUNGKONG> SELECT * FROM (SELECT good_id, good_nm, prc FROM tb_ag001 ORDER BY prc) WHERE ROWNUM < 9;GOOD_I GOOD_NM PRC------ ------------------------------ ----------133337 阳光宝贝防晒修复套SPF-30 0133424 旋覆透白绣花毛巾X1 0133428 左旋C新纪润白霜(7ml) 0133430 左旋C美白保湿精乳 0133528 美白晶澈爽肤水 0133530 左旋C燕窝初雪调养面膜 0138074 内置128兆TF卡水晶手链 0133728 化妆包1个 0已选择8行。 --------这是错误的结果。区别在于133628和138074这两条记录。已用时间: 00: 00: 00.0116:30:46 scott@TUNGKONG> SELECT rownum,a.* from tb_ag001 a order by prc; ROWNUM GOOD_I GOOD_NM PRC---------- ------ ------------------------------ ---------- 1 133337 阳光宝贝防晒修复套SPF-30 0 2 133424 旋覆透白绣花毛巾X1 0 3 133428 左旋C新纪润白霜(7ml) 0 4 133430 左旋C美白保湿精乳 0 5 133528 美白晶澈爽肤水 0 6 133530 左旋C燕窝初雪调养面膜 0 13 133628 左旋C-燕窝初雪调养面膜8g*2 0 -------------- 8 133728 化妆包1个 0 9 133828 BICATO活菌酵母修护晚霜5g 0 10 138068 蓝牙耳机*1128TF卡*1 0 11 138069 超速读卡器*1 0 12 138073 内置128兆TF卡天然水晶手链*1 0 7 138074 内置128兆TF卡水晶手链 0 --------------已选择13行。已用时间: 00: 00: 00.03
[解决办法]
在里层的查询,为什么不把rownum作为一个字段查出来?
[解决办法]
关注中!!!
------解决方案--------------------