在第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保證唯一性