Пейджинг с декартовым произведением - PullRequest
0 голосов
/ 28 июля 2010

Пожалуйста, добавьте комментарий, если для ответа на этот вопрос требуется дополнительная информация.

У нас есть запрос, который возвращает декартово произведение.Поскольку результатов много, потенциально масса гидратированных объектов.Мы хотели бы сделать простое разбиение на страницы в конце базы данных, чтобы оно было быстрым и чтобы оно получало только n результатов, начиная со строки n * страницы, где n, скажем, 100.

Проблема, с которой мы сталкиваемся, заключается вчто distinct выполняется в запросе, чтобы возвращать только необходимые строки.Но это приводит к тому, что результаты фильтруются, и вы получаете меньше 100.

Из-за этого, даже если у нас есть номер страницы, мы не будем знать, с чего начать или остановиться, не выполнив запрос, чтобы сначала увидетьотправная точка (т. е. мы не можем использовать rownum) и, возможно, циклический цикл до тех пор, пока мы не получим 100 результатов.Это грязно.

При необходимости мы можем сделать прямой SQL, но что-то вроде рефакторинга таблицы не вариант.

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

Заранее спасибо!

РЕДАКТИРОВАТЬ: @ nicolas78 опубликовал комментарий, которыйточно описывает ситуацию.

1 Ответ

2 голосов
/ 28 июля 2010

Вам нужно вставить DISTINCT дальше в запрос, чтобы он был выполнен до применения нумерации страниц .Например:

select deptno from
  ( select deptno, rownum as rn from
      ( select DISTINCT deptno
        from   emp
        order by deptno
      )
    where rownum < :pagenum*100
  )
where rn > (:pagenum-1)*100;
...