2010-07-28 4 views
0

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

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

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

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

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

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

Заранее благодарен!

EDIT: @ nicolas78 разместил комментарий, который точно описывает ситуацию.

+0

Я получаю смутное представление о том, что вы делаете. в основном вы не знаете, как обращаться, скажем, с 101-й строкой вашего результирующего набора, потому что он основан на двух параметрах и множестве комбинаций отбрасывается? Если да, я понятия не имею, как это предсказать (я предполагаю, что проблема заключается не в том, что вы пересылаете один или один назад, а прыгаете на что-то вроде страницы 5, где вы не знаете, как их получить, верно?). что не так полезно - просто пытается прояснить условия. – Nicolas78

+0

Да, это точно проблема. даже если мы попросим 100 результатов, все, что мы могли бы вернуть, - 67. Мы не знаем, с какой строки следует начинать при запросе страницы n –

ответ

2

Вам необходимо нажать 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;