问题描述
这两天在做oracle数据库分页时遇到一个问题,语句是这样的select userid,Name,rownum_ from ( select row_.*, rownum rownum_ from (SELECT * FROM v_users order by usertype) row_ where rownum <= 20) where rownum_ > 10结果如下:110142514刘静11210216027张刚12310020443杨青13410020695陆荣14510142503高明15610022743沈林16710216575沈敏17810013221郁晶18910051291俞雯191010114387侯芹20点击下一页,语句变为select userid,Name,rownum_ from ( select row_.*, rownum rownum_ from (SELECT * FROM v_users order by usertype) row_ where rownum <= 30) where rownum_ > 20结果如下:110040964沈芳21210144041孙奕22310142893马雅23410020695陆荣24510142503高明25610022743沈林26710216575沈敏27810013221郁晶28910051291俞雯291010114387侯芹30有相同的人被查询了出来,但是这里的userid字段肯定是唯一的,请问谁能告诉我为什么,谢谢?问题补充:是的,我的order字段不是主键,还是不明白如果这条语句SELECT * FROM v_users order by usertype单独执行,如果数据不变,是不是由于order by字段不是主键,每次取回来的记录顺序就不一样呢?
解决方案
如果order by 不能唯一确定记录的顺序就会出现这个问题。改变一下orderby的字段,换成主键什么的
解决方案二:
SELECT X.userid , X.NameFROM ( SELECT A.* , ROW_NUMBER() OVER(order by A.usertype) AS ROW_NO FROM v_users A) XWHERE X.ROW_NO > 10AND X.ROW_NO <= 20
解决方案三:
http://www.iteye.com/topic/9681这里解释得很清楚的。