zoukankan      html  css  js  c++  java
  • Oracle的思维(3)Oracle的万能分页并不万能,反而可能带来很难查出的危机

    在第1部里我把这个SQL列为无法理解的错误。这次经高人指点。总算把它弄明白了。

    public String getLimitString(String sql) {
      StringBuffer pagingSelect = new StringBuffer(100);
      pagingSelect.append("select * from ( select row_.*, rownum rownum_ from ( ");
      pagingSelect.append(sql);
      pagingSelect.append(" ) row_ where rownum <= ?) where rownum_ > ?");
      return pagingSelect.toString();
    }

    Oracle采用嵌套3层的查询语句结合rownum来实现分页,这在Oracle上是最快的方式,如果只是一层或者两层的查询语句的rownum不能支持order by。

    然而这个号称万能分页SQL的操作却给我带来了N多的麻烦。

    EG:
    名称                                      空?      类型
    ----------------------------------------- -------- --------------

    ID                                        NOT NULL NUMBER(38)(PK)
    TITLE                                     NOT NULL VARCHAR2(100)
    CONTENT                                            VARCHAR2(4000)
    OFFICE_ID                                          NUMBER(38)
    ORGTYPE_ID                                         NUMBER(38)
    PACKAGE_ID                                         NUMBER(38)
    STS                                                CHAR(1)
    和表
    SQL> desc ORGANIZE_TYPE
     名称                                      空?      类型
     ----------------------------------------- -------- ---------------

     ORGTYPE_ID                                NOT NULL NUMBER(38)(PK)
     NAME                                               VARCHAR2(100)
     STS                                                CHAR(1)
     TYPENAME                                           VARCHAR2(100)

    SQL>
    为例。

    以入参
    SELECT ORGANIZE.ID, ORGANIZE_TYPE.Name TypeName,ORGANIZE.TITLE  FROM ORGANIZE, ORGANIZE_TYPE
    WHERE  
    ORGANIZE_TYPE.ORGTYPE_ID = ORGANIZE.ORGTYPE_ID and  ORGANIZE_TYPE.sts='A'
    and  ORGANIZE.OFFICE_ID=128
    order by TypeName
    单独执行是对的。表面上查不出什么错误。但是放到里面就会出现逻辑错误。
    一定要以
    SELECT ORGANIZE.ID, ORGANIZE_TYPE.Name TypeName,ORGANIZE.TITLE  FROM ORGANIZE, ORGANIZE_TYPE
    WHERE  
    ORGANIZE_TYPE.ORGTYPE_ID = ORGANIZE.ORGTYPE_ID and  ORGANIZE_TYPE.sts='A'
    and  ORGANIZE.OFFICE_ID=128
    order by TypeName,ID放入才可以。
    因为上面这句扔到里面后。因为经过多次order by 。由于ORGANIZE_TYPE.Name为非主键,无法保证按ORGANIZE_TYPE.Name排序后还是对的了,所以还要多加一个ORGANIZE.ID保证唯一性 

  • 相关阅读:
    通俗易懂,什么是.NET?什么是.NET Framework?什么是.NET Core?(转)
    Yii Framework2.0开发教程(5)数据库mysql性能
    假设动态运行java文字,当在脚本式配置,这是非常方便的
    采用jquery的imgAreaSelect样品图像裁剪示范插件实现
    Mybatis 构造resultMap 搜sql
    第13周项目1-动物所谓的
    旋转华尔兹
    馋-c语言的规则
    毕业后的第二份工作:进入国外 在新加坡工作 每月一次18K
    Bringing up interface eth0: Device eth0 does not seem to be present, delaying initialization
  • 原文地址:https://www.cnblogs.com/tongzhenhua/p/17659.html
Copyright © 2011-2022 走看看