Есть ли запрос для извлечения данных из таблицы Sybase по условию количества записей

У меня есть ситуация, когда мне нужно выбрать записи из таблицы Sybase на основе определенного условия

  1. Запись нужно извлекать партиями. Если общее количество равно 2000, мне нужно извлечь 500 в первой партии и 500 в следующей партии, пока не будет достигнуто 2000 записей.
  2. Я использовал условие ограничения, но оно дает неправильный синтаксис
select top 2 * 
from CERD_CORPORATE..BOOK 
where id_bo_book in('5330') 
limit(2,3)

person Bicky    schedule 23.08.2019    source источник
comment
У вас опечатка в CERD_CORPORATE..BOOK, не так ли?   -  person Дмитрий Сиденко    schedule 23.08.2019
comment
какая версия АСЕ? поддержка limit/offset не появляется до ASE 16.x   -  person markp-fuso    schedule 23.08.2019
comment
Если это не 16.x, то есть ли другой способ выполнить эту задачу? В таблице может быть 20 тыс. записей, и может потребоваться извлечь 1500 записей в каждом операторе выбора.   -  person Bicky    schedule 26.08.2019


Ответы (2)


Вы не можете использовать диапазон для условия LIMIT, но можете использовать ключевое слово OFFSET для это:

SELECT top 2 * FROM CERD_CORPORATE.BOOK 
WHERE id_bo_book in('5330') 
LIMIT 2 OFFSET 1;
person Дмитрий Сиденко    schedule 23.08.2019
comment
Спасибо, но не повезло. Тем не менее он говорит, что неверный синтаксис близок к пределу - person Bicky; 25.08.2019

В ASE 12.5.1 и более поздних версиях это можно сделать с помощью «Производной таблицы SQL» или «Встроенного представления». Запрос требует, чтобы каждая строка имела уникальный ключ, чтобы таблица могла быть соединена сама с собой, и может быть возвращено количество строк, в которых значение ключа меньше, чем у соединяемой строки. Это дает монотонно возрастающее число, с помощью которого можно указать предел и смещение.

Эквивалентами limit и offset являются значения, сравниваемые с x.rowcounter.

select
        x.rowcounter,
        x.error,
        x.severity
    from
        (
            select
                    t1.error,
                    t1.severity,
                    t1.description,
                    count(t2.error) as rowcounter
                from
                    master..sysmessages t1,
                    master..sysmessages t2
                where
                    t1.error >= t2.error
                group by
                    t1.error,
                    t1.severity,
                    t1.description
        ) x
    where
        x.rowcounter >= 50
    and x.rowcounter < 100

Производные таблицы SQL доступны еще в Sybase ASE 12.5.1, Производные таблицы SQL

Использование master..sysmessages в этом примере обеспечивает приемлемый (10 000 строк) набор данных для экспериментов.

person Richard Crossley    schedule 27.08.2019