天天看點

Oracle中ROWNUM僞列的使用

昨天小定同學突然問我一個分頁問題,分頁幹嘛要這樣分成兩層查詢,而不是對行号一層過濾就可以了呢?分頁語句的文法類似是這樣的:

SELECT * FROM   
    (SELECT ROWNUM AS RN, T.* FROM PA_LD_BASIC_DATA T WHERE ROWNUM <= 200)
WHERE  RN > 100;
           

小定同學的想法是為什麼不能是如下這種寫法呢?

SELECT ROWNUM, T.* FROM  PA_LD_BASIC_DATA T 
WHERE  ROWNUM <= 200 AND
       ROWNUM > 100;
           

想來Oracle的僞列經常被使用,但可能有同學對它到底是怎麼用的,具體的用法不是很清楚,結合Oracle官方文檔,在這裡寫一點總結。

查詢官方文檔如下:

Oracle中ROWNUM僞列的使用

rownum是一種分析功能,在資料集查詢完成後,在任何聚合和排序操作之前為要應用它的每一行(分區中的每一行或查詢傳回的每一行)配置設定一個唯一的編号,且總是從1開始。

Oracle中ROWNUM僞列的使用

而且文檔中說明,任何大于rownum的值的篩選條件結果總是為false,不會查詢出任何資料。例如當條件為rownum > 10時,查詢完成,為資料集第一行資料的rownum配置設定為1,不滿足條件,然後資料集的第二行的rownum現在配置設定為1,以此下去,rownum > 10的條件将永遠不會滿足,是以沒有任何資料被傳回。

最後看我們的分頁查詢,直接使用rownum > 100也将不會傳回任何資料,是以分頁的時候不能同時對rownum采用between...and這種篩選,需要采用子查詢建構資料集,讓rownum成為資料集的列,然後對該列進行過濾。