美文网首页
rownum浅谈(二)

rownum浅谈(二)

作者: 一二三言 | 来源:发表于2017-05-10 09:35 被阅读25次

    上篇说到rownum和order by及索引列的关系,明白了通过构建一个子查询把查询结果固定住再取数就可以了 。还是取最近10条创建的用户:

    select * from (select u.* from t_user u order by u.c_createdate desc) where rownum <= 10;

    这样的话就不用管order by后面的字句是否有索引,都会先执行排序再标记rownum,就能得到想要的结果了。

    如果想要得到大于10条呢,是不是只要改成>10就可以了,试试先
    select * from (select u.* from t_user u order by u.c_createdate desc) where rownum > 10;

    结果是一条数据也没有,为什么呢?

    因为where字句后面是条件语句,rownum>10为真为假?因为rownum始终是从1开始的,第一条1>10为假,第二条的rownum又成了1,继续判断,依次类推,所以对任何rownum大于1的执行语句都查不到任何数据,如果等于1的话就返回第一条查到的数据。

    同理 !=10 返回前10条数据,rownum >0 或者 rownum>= 1返回所有数据。因此只要理解了rownum是从1开始,条件成立后依次加1就可以了。

    如果想要查询大于10条的数据呢,同理,只要“固定住rownum”,把它当做一个列来使用就可以了。

    select * from (select rownum as rn,m.* from (select u.* from t_user u order by u.c_createdate desc) m )n where n.rn > 2;

    那么在实际应用中,分页的话需要取一段数据,即需要大于、小于取数据,同理可以知道,只要构造子查询,让rownum固定下来就可以查询某段数据了。

    select * from (select rownum as r,m.* from (select rownum as rn,u.* from t_user u order by u.c_createdate desc)m where m.rn < 20 ) where r > 10;

    或者封装成一个方法可以进行调用:

    public static String pageSql(int start, int end, String sql) {
    StringBuffer sbu = new StringBuffer();
    sbu.append(" SELECT * FROM (SELECT A.*,ROWNUM RN ")
    .append(" FROM (")
    .append(sql)
    .append(" ) A WHERE ROWNUM <")
    .append(end)
    .append(" ) WHERE RN >")
    .append(start);
    return sbu.toString();
    }

    相关文章

      网友评论

          本文标题:rownum浅谈(二)

          本文链接:https://www.haomeiwen.com/subject/fnpwtxtx.html