zoukankan      html  css  js  c++  java
  • rownum浅谈(二)

    上篇说到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();
    }    
  • 相关阅读:
    react setstate
    【css】长文本左侧显示省略号
    react 获取input标签的输入值
    【react 分页器】 基于react-virtualized组件的分页器
    type为number的<input>标签 type和size属性失效
    js 获取Array数组 最大值 最小值
    ubuntu 编辑pdf
    【react redux && flux】
    远程唤醒、WOL、Magic_Packet
    win10无法访问局域网共享文件?(因微软账户和本地账户登陆问题导致)
  • 原文地址:https://www.cnblogs.com/superFish2016/p/6834250.html
Copyright © 2011-2022 走看看