2013-10-15 7 views
7

Я следующий запрос для ведения пагинацииПолучить общее количество строк в постраничной запросе

SELECT * 
    FROM (SELECT e.*, 
       ROWNUM row_num 
      FROM (SELECT emp_no, 
         emp_name, 
         dob 
        from emp) outr 
      WHERE ROWNUM < ((pagenum * row_size) + 1)) 
WHERE row_num >= (((pagenum - 1) * row_size) + 1) 

Я хотел бы получить количество строк, а в том же запросе, и для этого я попытался с помощью

COUNT(*) OVER() 

Однако я не получаю точных результатов, когда я разбиваю на страницы на следующий набор страниц и строк.

Как можно эффективно использовать COUNT(*) OVER()?

+2

Просьба предоставить образец данных и желаемый результат. –

+1

Вы должны поместить COUNT (*) в самый внутренний запрос: 'SELECT emp_no, emp_name, dob, COUNT (*) FROM emp'. Конечно, таким образом вам придется подсчитывать все строки каждый раз, когда вы извлекаете записи для следующей страницы. Я полагаю, вы не хотите получать число строк один раз? –

+0

@PrzemyslawKruglej Не могли бы вы объяснить, что именно вы подразумевали под ** Я полагаю, вы не хотите получать число строк один раз? ** – user75ponic

ответ

11

Типичный пагинация запрос с общим числом строк будет:

SELECT * 
    FROM (SELECT outr.*, 
       ROWNUM row_num 
      FROM (SELECT emp_no, 
         emp_name, 
         dob, 
         count(*) over() total_nb 
        FROM emp 
       ORDER BY ...) outr 
     WHERE ROWNUM < ((pagenum * row_size) + 1)) 
WHERE row_num >= (((pagenum - 1) * row_size) + 1) 

Не забывайте ORDER BY.

+0

Спасибо, что решает мою проблему. – user75ponic

+0

Винсент, используя 'count (*) over()', имеет какое-то влияние на производительность? – user75ponic

+0

по сравнению с чем? по сравнению с тем, что у вас нет полной уверенности: вы просите Oracle получить счетчик, поэтому он в основном должен извлекать все строки. По сравнению с другим методом? хорошо, что это, вероятно, будет хорошо выполняться в большинстве случаев, я думаю, это будет зависеть от другого метода. –

Смежные вопросы