Уже немного поздно, но если кто-то использует ORACLE, то приходит потовое решение:
SELECT
q.*,
ROWNUM DB_ROWNUM,
(SELECT max(ROWNUM) FROM ($sql)) DB_COUNT
FROM
($sql) q
$ sql, конечно, ваш запрос. Оптимизатор оракулов достаточно умен, чтобы не выполнять все дважды.
Теперь каждая извлеченная строка содержит текущий номер строки (полезно для нумерации строк сетки подкачки) в DB_ROWNUM и полное количество строк в DB_COUNT. Вам по-прежнему нужно выбрать хотя бы одну строку (так что это не совсем ответ на вопрос выше;)), но использование потом идет следующим образом:
Это также очень простой способ запуска и ограничения в Oracle и получения полного числа строк:
SELECT * FROM (
SELECT /*+ FIRST_ROWS($limit) */
q.*,
ROWNUM DB_ROWNUM,
(SELECT max(ROWNUM) FROM ($sql)) DB_COUNT
FROM
($sql) q
WHERE
ROWNUM <= $limit
)
WHERE
DB_ROWNUM > $start
При этом вы можете выбрать только строки 51-100 для второй страницы в вашей сетке, но при этом иметь реальный номер строки (начиная с 1) и полный счет (без начала и ограничения) в каждой выбранной строке.