2017-10-17 93 views
0

我有以下SQL結構:SQL查詢分頁

SELECT * FROM (
    SELECT subquery.* FROM (
     SELECT some_columns 
     FROM some_tables 
     WHERE junctions_critereas 
     GROUP BY some_columns 
     UNION 
     SELECT some_columns 
     FROM some_tables 
     WHERE junctions_critereas 
     GROUP BY some_columns) subquery 
    GROUP BY some_columns) 
WHERE ROWNUM > startRecord AND ROWNUM <= endRecord; 
  • 如果我排除ROWNUM criterea查詢將返回33條記錄。
  • 如果我把startRecord = 0和endRecord = 10,查詢返回10個第一個 記錄。
  • 如果我把startRecord = 0和endRecord = 20查詢返回20個第一個記錄。
  • 如果我把startRecord = 0和endRecord = 40,查詢返回所有33條記錄。
  • 如果我把startRecord = 10和endRecord = 20查詢返回沒有記錄。

如果我將最終的WHERE更改爲WHERE ROWNUM BETEEW startRecord AND endRecord,我得到了相同的結果。

有人知道這裏發生了什麼?

+2

你的例子有'ROWNUM startRecord' – RToyo

回答

2

(注:我假設,第一個條件是真的ROWNUM < startRecord爲@RToyota在註釋中指出。)

甲骨文documentation是關於這個非常明確:

條件測試大於正整數 的ROWNUM值始終爲假。例如,該查詢返回任何行:

SELECT * FROM employees 
    WHERE ROWNUM > 1; 

第一行取出被分配的1 ROWNUM並使 條件假。第二行被取出現在是第一行,並且 也被分配了1的ROWNUM並且使條件成爲假。隨後所有行 都無法滿足條件,因此不會返回行。

在Oracle 12c中,您可以使用OFFSET/FETCH NEXT。在早期版本中,您可以使用row_number()或使用偏移量嵌套查詢。

+0

我以其他方式解決了這個問題......但是我無法發佈我的答案...... – BrunoTS