Oracle的思维(3)Oracle的万能分页并不万能,反而可能带来很难查出的危机
2004-06-21 22:26
633 查看
在第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保证唯一性
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保证唯一性
相关文章推荐
- Oracle的思维(4)Oracle的万能分页并不万能2
- 万能的知乎(下):当“水化”危机不可避免,拯救知乎的一千种可能
- Oracle万能分页法的存储过程
- 磁盘扩容,对被分割盘带来的可能的危机(文件上锁)
- 基于Hibernate分页原理的Oracle专用高效万能分页控件
- oracle游标(返回多条数据)分页
- oracle,mysql,SqlServer三种数据库的分页查询
- 分页(Paging) / SQL Server / Oracle
- Oracle分页存储过程
- oracle 分页查询和sql server 分页查询 的sql语句
- oracle 分页
- Oracle的分页查询语句优化
- Oracle分页查询的三种方法
- Oracle,SQL Server,Access万能数据库通用类DBHelper
- [跟着hsp步步学习系统]oracle培训学习集锦全360度扫描(10)一个分页存储过程
- Oracle分页查询语句2
- Oracle大数据量分页显示的初步实现
- 【思维智慧】006.越是“不可能的”事做起来越顺当
- 【校赛】史上题面最短的题但是题目标题很长并且这题可能很简单也可能很难
- 改进的Oracle分页存储过程