您的位置:首页 > 数据库 > Oracle

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保证唯一性
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: