задачка по SQL (DB2)
в запросе limit не работает ?
Или его вообще там не?
если есть, то : limit N, M;
Или его вообще там не?
если есть, то : limit N, M;
limit - фича MySQL, сделанная специально для такой задачи
lf вродда в sybase есть....
Можно достать один раз список всех ключей этих записей, а при смене страницы передавать список нужных ключей.
Но мб там есть какие-нибудь встроенные средства...
Но мб там есть какие-нибудь встроенные средства...
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
тогда уж лучше достать первые N*M строк, а потом взять следующие M
но эти варианты не катят, нужно именно то, что я написал в первом посте
но эти варианты не катят, нужно именно то, что я написал в первом посте
IBM предлагает делать так (link):
SELECT * FROM (SELECT NAME, rownumber OVERпохоже лучше не получится
(ORDER BY NAME)
AS rn FROM ADDRESS)
AS tr WHERE rn BETWEEN 11 and 20
limit - фича MySQL, сделанная специально для такой задачину хз... в постгресе есть
хотя DB2 - то ещё счастье
select ... from .. limit N offset 8
У этих пид%ров нету побитовых операций

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

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

В Оракле курсор есть, с ним эта задача тоже решаетсяКстати, а как это грамотно сделать?
Просто когда мне нужны записи от N до М, делаю так
при открытии курсора ставлю условие RowNum<M
потом в цикле до N фетчу этот курсор
и уже после этого возвращаю его в Яву
а нельзя ли обойтись без этой кучи фетчей?
Вообще, на классическом 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) и курсорами.
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) и курсорами.
насколько я понял из объяснения именно так и есть грамотно.
а нельзя ли обойтись без этой кучи ...life is shit
> life is shit
Особенно если учесть, что если данные меняются, то большая часть предложенных способов будут себя вести странно при переходе со страницы на страницу
Особенно если учесть, что если данные меняются, то большая часть предложенных способов будут себя вести странно при переходе со страницы на страницу
ну надо заметить, что и в этом форуме так происходит
Оставить комментарий
sergei1969
есть запрос, который вытаскивает записи из таблицы по условию и выводит их спискомнужно организовать постраничный вывод списка с перемещением по страницам по номеру, соответственно нужно добавить какое-то условие, которое ограничит выборку записями с (N*M)-й по (N+1)*M, где N - номер страницы, M - кол-во записей на страницу.
как это сделать в DB2 ?
p.s. знаю, что там есть конструкция fetch first M records, но пока с ней ниего хорошего не придумал