задачка по SQL (DB2)

sergei1969

есть запрос, который вытаскивает записи из таблицы по условию и выводит их списком
нужно организовать постраничный вывод списка с перемещением по страницам по номеру, соответственно нужно добавить какое-то условие, которое ограничит выборку записями с (N*M)-й по (N+1)*M, где N - номер страницы, M - кол-во записей на страницу.
как это сделать в DB2 ?
p.s. знаю, что там есть конструкция fetch first M records, но пока с ней ниего хорошего не придумал

stm7884696

в запросе limit не работает ?
Или его вообще там не?
если есть, то : limit N, M;

sergei1969

limit - фича MySQL, сделанная специально для такой задачи

stm7884696

lf вродда в sybase есть....

durka82

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

sergei1969


select * from TEST limit 5,10


DBA2191E SQL execution error.

com.ibm.db.DataException: Ошибка
менеджера баз данных. : [IBM][CLI Driver][DB2/NT] SQL0104N An
unexpected token "* from TEST limit" was found
following "select ". Expected tokens may include: "<space>".
SQLSTATE=42601

sergei1969

тогда уж лучше достать первые N*M строк, а потом взять следующие M
но эти варианты не катят, нужно именно то, что я написал в первом посте

sergei1969

IBM предлагает делать так (link):
 SELECT * FROM (SELECT NAME, rownumber OVER
(ORDER BY NAME)
AS rn FROM ADDRESS)
AS tr WHERE rn BETWEEN 11 and 20
похоже лучше не получится

zya369

limit - фича MySQL, сделанная специально для такой задачи
ну хз... в постгресе есть

select ... from .. limit N offset 8
хотя DB2 - то ещё счастье
У этих пид%ров нету побитовых операций

sergei1969

в постгресе есть
хм... не знал
ну по крайней мере в Oracle и DB2 нету

voronetskaya

В Оракле курсор есть, с ним эта задача тоже решается.

sergei1969

как и в DB2
следующий вопрос:
как быстрее? мне кажется, что на очень длинной табличке вложенные select'ы будут быстрее, чем fetch'ить дох@#я записей

voronetskaya

как быстрее
тут умные люди говорят что-то про индексы

ifani

В Оракле курсор есть, с ним эта задача тоже решается
Кстати, а как это грамотно сделать?
Просто когда мне нужны записи от N до М, делаю так
при открытии курсора ставлю условие RowNum<M
потом в цикле до N фетчу этот курсор
и уже после этого возвращаю его в Яву
а нельзя ли обойтись без этой кучи фетчей?

daru

Вообще, на классическом SQL эта шняга делается примерно так:
SELECT * FROM T
WHERE (SELECT COUNT(*) FROM T AS T1 WHERE T1.id < T.id) BETWEEN N*M AND (N+1)*M-1
но почти в каждой БД есть какие-нибудь расширения для оптимизации подобного запроса, ибо в приведенном примере речь о производительности не идет...
P.S. На MS-SQL можно поизвращаться с TOP (не годится для процедур, так как нельзя передать параметр в TOP) и курсорами.

voronetskaya

насколько я понял из объяснения именно так и есть грамотно.
а нельзя ли обойтись без этой кучи ...
life is shit

Dasar

> life is shit
Особенно если учесть, что если данные меняются, то большая часть предложенных способов будут себя вести странно при переходе со страницы на страницу

Marinavo_0507

ну надо заметить, что и в этом форуме так происходит
Оставить комментарий
Имя или ник:
Комментарий: