Paging in Pervasive SQL


0

Как сделать пейджинг в Pervasive SQL (версия 9.1)? Мне нужно сделать что-то подобное:

//MySQL 
SELECT foo FROM table LIMIT 10, 10 

Но я не могу найти способ определения смещения.

0

Я закончил работу с поисковым вызовом в коде. Я просто пропущу первые записи в цикле.

Я думал, что составил простой способ для создания подкачки, но кажется, что распространенный sql не разрешает оговорки о заказе в подзапросах.Но это должно работать на других БД (я тестировал его на Жар)

select * 
from (select top [rows] * from 
(select top [rows * pagenumber] * from mytable order by id) 
order by id desc) 
order by id 

0

Я сталкиваюсь с этой проблемой в MS Sql тоже ... нет Функции ограничения или рулона. То, что я делаю, это вставить ключи для моего окончательного результата запроса (или иногда всего списка полей) в таблицу temp с столбцом идентификатора ... затем я удаляю из таблицы temp все вне диапазона, который я хочу ... затем используйте соединение с ключами и исходной таблицей, чтобы вернуть элементы, которые я хочу. Это работает, если у вас есть хороший уникальный ключ - если вы этого не сделаете, ну ... это проблема дизайна сама по себе.

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

Итак ... в псевдокоде ... чтобы захватить пункты 80-89 ...

create table #keys (rownum int identity(1,1), key varchar(10)) 

insert #keys (key) 
select TOP 89 key from myTable ORDER BY whatever 

delete #keys where rownumber < 80 

select <columns> from #keys join myTable on #keys.key = myTable.key 

1

Наша пейджинговая требуется, чтобы мы смогли пройти в номер текущей страницы и размер страницы (по с некоторыми дополнительными параметрами фильтра) в качестве переменных. Поскольку select top @page_size не работает в MS SQL, мы разработали временную или переменную таблицу, чтобы назначить первичным ключам каждой строки идентификатор, который впоследствии может быть отфильтрован для нужного номера и размера страницы.

** Обратите внимание, что если у вас есть первичный ключ GUID или составной ключ, вам просто нужно изменить идентификатор объекта во временной таблице на уникальный идентификатор или добавить дополнительные столбцы ключей в таблицу.

Недостатком этого является то, что он все равно должен вставлять все результаты во временную таблицу, но по крайней мере это только ключи. Это работает в MS SQL, но должно быть в состоянии работать для любой БД с минимальными настройками.

объявить @page_number INT, @page_size Int - добавить любой дополнительный поиск параметров здесь

--create временная таблица со столбцом идентификации и идентификатор
--of записи, вы будете выбирать. Это значение в памяти
- таблица, поэтому, если количество строк, которые вы будете вставлять, больше
- на 10000, тогда вы должны использовать временную таблицу в tempdb
- instead. Чтобы сделать это, используйте
--create TABLE #temp_table (row_num INT IDENTITY (1,1), ObjectID Int)
--и изменить все ссылки на @temp_table к #temp_table
DECLARE @temp_table TABLE (row_num Int IDENTITY (1,1), ObjectID целое)

--insert во временную таблицу с идентификаторами записей
--мы хотят вернуться.Очень важно убедиться, что порядок
- отображает порядок возврата записей, чтобы row_num
- значения были установлены в правильном порядке, и мы выбираем
- правильные записи на основе страницы
INSERT INTO @temp_table (ObjectID)

/* Пример: Выбор, который вставляет записи во временную таблицу
ВЫБОР PersonId
оТ человека с (NOLOCK)
внутреннее соединение степени с (NOLOCK) на градус. personid = человек.personid
ГДЕ person.lastname = @last_name
ORDER BY person.lastname ASC, person.firsname Asc
*/

--get общего количества строк, которые мы соответствовали
DECLARE @total_rows INT
SET @total_rows = @@ ROWCOUNT
--calculate общее число страниц, основанных на количестве
--rows, которые соответствовали и размеру страницы переданном в качестве параметра
ЗАЯВЛЯЮ @total_pages Int
--add @ page_size - 1 к общему количеству строк до
- вычислить общее количество страниц. Это происходит потому, что SQL
--alwasy округляет для разделения целого
SET @total_pages = (@total_rows + @page_size - 1)/ @page_size

--Возвращенных результирующего набора, мы заинтересованы в присоединившись
- возврат к @temp_table и фильтрация по строке_num
/* Пример: Выбор данных для возврата. Если вставка была сделана
должным образом, то вы всегда должны присоединяться к таблице , которая содержит
строки для возврата в ObjectId колонке на @temp_table

SELECT, человека. *
ОТ человека С (NOLOCK) INNER JOIN @temp_table TT
ON person.personid = tt.objectid
*/
--Возвращенных только строки в странице, что мы заинтересованы в
-го порядка по колонку ROW_NUM из@temp_table, чтобы убедиться, что
--мы выбираете правильные записи
ГДЕ tt.row_num < (@page_size * @page_number) + 1
И tt.row_num> (@page_size * @page_number) - @page_size
ЗАКАЗ BY tt.row_num


2

Испытано запрос в PSQL:

select top n * 
from tablename 
where id not in(
select top k id 
from tablename 
) 

для всех п = No.of записей и нужно принести в то время. и k = кратные n (например, n = 5; k = 0,5,10,15, ....)