Пейджинг в Pervasive SQL

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

//MySQL
SELECT foo FROM table LIMIT 10, 10

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

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
0
4 110
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

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

Альтернативный вариант с немного лучшей производительностью - пропустить этап удаления и просто использовать номера строк в финальном соединении. Еще одно улучшение производительности - это использование оператора 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

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

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

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

declare @page_number int, @page_size int -- add any additional search parameters here

--create the temporary table with the identity column and the id
--of the record that you'll be selecting. This is an in memory
--table, so if the number of rows you'll be inserting is greater
--than 10,000, then you should use a temporary table in tempdb
--instead. To do this, use
--CREATE TABLE #temp_table (row_num int IDENTITY(1,1), objectid int)
--and change all the references to @temp_table to #temp_table
DECLARE @temp_table TABLE (row_num int IDENTITY(1,1), objectid int)

--insert into the temporary table with the ids of the records
--we want to return. It's critical to make sure the order by
--reflects the order of the records to return so that the row_num
--values are set in the correct order and we are selecting the
--correct records based on the page
INSERT INTO @temp_table (objectid)

/* Example: Select that inserts records into the temporary table
SELECT personid
FROM person WITH (NOLOCK)
inner join degree WITH (NOLOCK) on degree.personid = person.personid
WHERE person.lastname = @last_name
ORDER BY person.lastname asc, person.firsname asc
*/

--get the total number of rows that we matched
DECLARE @total_rows int
SET @total_rows = @@ROWCOUNT
--calculate the total number of pages based on the number of
--rows that matched and the page size passed in as a parameter
DECLARE @total_pages int
--add the @page_size - 1 to the total number of rows to
--calculate the total number of pages. This is because sql
--alwasy rounds down for division of integers
SET @total_pages = (@total_rows + @page_size - 1) / @page_size

--return the result set we are interested in by joining
--back to the @temp_table and filtering by row_num
/* Example: Selecting the data to return. If the insert was done
properly, then you should always be joining the table that contains
the rows to return to the objectid column on the @temp_table

SELECT person.*
FROM person WITH (NOLOCK) INNER JOIN @temp_table tt
ON person.personid = tt.objectid
*/
--return only the rows in the page that we are interested in
--and order by the row_num column of the @temp_table to make sure
--we are selecting the correct records
WHERE tt.row_num < (@page_size * @page_number) + 1
AND tt.row_num > (@page_size * @page_number) - @page_size
ORDER BY tt.row_num

Ответ принят как подходящий

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

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

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

Протестированный запрос в PSQL:

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

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

Другие вопросы по теме