Oracle的思維(3)Oracle的萬能分頁並不萬能,反而可能帶來很難查出的危機

來源:互聯網
上載者:User

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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.