亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

分頁查詢最好加排序(order by)

昨天,与外部化系统对接时,发现有一个数据一直咩有集成到,双方各自排查了自己系统的代码,都觉得逻辑非常简单,无法就是一个分页查询而已。

问题就出在这个分页查询上。

为了说明当时问题发生的情景,我模拟了一个SQL查询:


SELECT ID, OBJECT_NAME, OWNER

FROM 

 (

 SELECT ROWNUM RN, ID, OBJECT_NAME, OWNER

 FROM 

 (

 SELECT OWNER, OBJECT_NAME, ID

 FROM MY_TABLE

 )

 WHERE ROWNUM <= 800

 )

WHERE RN >= 1;

以上是一段典型的Oracle数据库的分页查询,又以查询结果集的第1条至第800条数据。

如果想查询第二页的数据,只需要改到RN和ROWNUM即可。以下是查第二页的数据的SQL:


SELECT ID, OBJECT_NAME, OWNER

FROM 

 (

 SELECT ROWNUM RN, ID, OBJECT_NAME, OWNER

 FROM 

 (

 SELECT OWNER, OBJECT_NAME, ID

 FROM MY_TABLE

 )

 WHERE ROWNUM <= 1600

 )

WHERE RN >= 801;

问题背景

上述SQL中从MY_TABLE查询结果集本身是没有问题的,因为符合条件的数据总数是不会变的。但是有一个问题,从MY_TABLE查询的结果集是没有做排序的,意味着每次查询的数据的位置可能发生变化。由于分页查询,其实是从MY_TABLE查询查询了多次,每次数据的位置不确定,导致查询出来的结果,有可能查得出来,有可能查询重复。这就是问题的根源。

解决方案

知道问题所在解决起来就简单了,就是加排序。让每次查询出来的数据按到固定位置查出来就没有了。以下是示例:


SELECT ID, OBJECT_NAME, OWNER

FROM 

 (

 SELECT ROWNUM RN, ID, OBJECT_NAME, OWNER

 FROM 

 (

 SELECT OWNER, OBJECT_NAME, ID

 FROM MY_TABLE

 ORDER BY ID

 )

 WHERE ROWNUM <= 1600

 )

WHERE RN >= 801;

一般来说,排序的字段最好是唯一值。如果是非唯一的字段,那么最好用多个能确定唯一性的字段来实现排序也是可以的。否则无法启动排序的效果,问题还是会出现。

點擊查看更多內容
2人點贊

若覺得本文不錯,就分享一下吧!

評論

作者其他優質文章

正在加載中
全棧工程師
手記
粉絲
1.7萬
獲贊與收藏
2192

關注作者,訂閱最新文章

閱讀免費教程

感謝您的支持,我會繼續努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進行掃碼打賞哦
今天注冊有機會得

100積分直接送

付費專欄免費學

大額優惠券免費領

立即參與 放棄機會
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號

舉報

0/150
提交
取消