Смещение Sybase для нумерации страниц - PullRequest
5 голосов
/ 13 октября 2011

Есть ли простой способ реализовать нумерацию страниц в sybase? В postgres есть предел и смещение, в mysql есть предел X, Y. Что насчет sybase? Существует верхний предел ограничения результатов, но для достижения полной нумерации страниц также необходимо смещение. Это не проблема, если есть несколько страниц, я могу просто обрезать результаты на стороне клиента, но если есть миллионы строк, я хотел бы получить только те данные, которые мне нужны.

Ответы [ 6 ]

4 голосов
/ 11 декабря 2012
// First row = 1000
// Last row = 1009
// Total row = 1009 - 1000 + 1 = 10
// Restriction: exec sp_dboption 'DATABASE_NAME','select into/bulkcopy','true'
select TOP 1009 *, rownum=identity(10) 
into #people
from people 
where upper(surname) like 'B%'
select * from #people where rownum >= 1000
drop table #people
// It shoulde be better SQL-ANSI-2008 (but we have to wait):
// SELECT * FROM people
// where upper(surname) like 'B%'
//    OFFSET 1000 ROWS FETCH NEXT 10 ROWS ONLY
3 голосов
/ 14 октября 2011

Цитирование из http://www.isug.com/Sybase_FAQ/ASE/section6.2.html#6.2.12:

Sybase не имеет прямого эквивалента rownum Oracle, но его функции можно эмулировать во многих случаях.

Вы можетеустановите максимальное значение rowcount, которое ограничит количество строк, возвращаемых любым конкретным запросом:

set rowcount 150

Это ограничение будет применяться до его сброса:

set rowcount 0

Вы можете выбратьво временную таблицу, затем извлеките данные из нее:

set rowcount 150

select pseudo_key = identity(3),
       col1,
       col2
  into #tempA
  from masterTable
 where clause...
 order by 2,3

select col1,col2 from #tempA where pseudo_key between 100 and 150

Вы можете оптимизировать хранение во временной таблице, сохраняя только столбцы идентификаторов, которые затем присоединяются к исходной таблице для выбора.

В FAQ также предлагаются другие решения, в том числе курсоры или Sybperl.

2 голосов
/ 17 сентября 2018

Я очень опоздал на вечеринку, но случайно наткнулся на эту проблему и нашел лучший ответ, используя TOP и START AT из sybase doc.Вам нужно использовать ORDER BY для или у вас будут непредсказуемые результаты.

http://dcx.sybase.com/1101/en/dbusage_en11/first-order-formatting.html

ВЫБРАТЬ ТОП-2 НАЧАТЬ НА 5 * ОТ РАБОТНИКОВ ПО Фамилии DESC;

0 голосов
/ 28 января 2019

Пример Sybase SQL Anywhere, количество строк на странице: 10, смещение: 1000.

SELECT top 10 start at 1001  * FROM employee order by employeeid

Примечание. Необходимо указать столбец order by.

0 голосов
/ 31 октября 2017

Вы можете попробовать использовать набор ROWCOUNT дважды, как это:

    declare @skipRows int, @getRows int
    SELECT @skipRows=50
    SELECT @getRows=10
    set ROWCOUNT @skipRows
    SELECT caslsource_id into #caslsource_paging FROM caslsources
    set rowcount @getRows
    Select * from caslsources where caslsource_id not in (select caslsource_id from #caslsource_paging)
    DROP TABLE #caslsource_paging

Это создает временную таблицу строк для пропуска. Вам нужно будет добавить предложения WHERE и ORER BY к обоим SELECT, чтобы пропустить нужные страницы.

0 голосов
/ 03 ноября 2011

К сожалению, Sybase не предоставляет возможность устанавливать предел запуска и смещения.Лучшее, что вы можете достичь - это использовать SET ROWCOUNT, чтобы ограничить количество возвращаемых записей.Если у вас 1000 записей и вы хотите просмотреть 50 записей, то примерно так будет возвращена первая страница ...

set rowcount 50
select * from orders

Для второй страницы ...

set rowcount 100
select * from orders

... и затем вы можете не отображать первые 50 из вашего Java-кода.Очевидно, что по мере продвижения страницы вам придется возвращать все большие и большие наборы данных.Ваш вопрос о том, что делать с 1 000 000 записей, не кажется практичным для разбитого на страницы пользовательского интерфейса.Ни один пользователь не ищет в Google, а затем просматривает страницы в 1000 раз.

Что если у меня есть естественный ключ?

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

set rowcount 50
select * from people 
where upper(surname) like 'B%'

Когда есть более 50 человек с фамилией, начинающейся с 'B', вы используете тот же подход, что и выше, чтобы перейти на следующую страницу ...

set rowcount 100
select * from people 
where upper(surname) like 'B%'

... и удалить первые 50 в коде Java.

Исходя из этого примера, может быть, вы можете ограничить поиск по дате или другим данным, значимым для запросов ваших пользователей.

Надеюсь, это поможет!

...