Ограничение запросов SQL для DB2 AS / 400 версии 4

Я знаю, что версия слишком старая (да, версия 4!), но у меня нет выбора.

как ограничить мой запрос, например, 100 строк только для DB2 AS400?

FETCH FIRST n ROWS ONLY

и

ROW_NUMBER()

не работают.

любые идеи или обходные пути?

вот пример SQL-запроса (не работает):

SELECT POLNOP FROM ZICACPTF.POLHDR FETCH FIRST 10 ROWS ONLY

Он говорит:

[SQL0199] выборка ключевых слов не ожидается. Действительные токены: для соединения с заказом ОПТИМИЗИРОВАТЬ.

2 ответов


нет поддержки СУБД для этой операции, проверьте версия 4 DB2 UDB для AS / 400 SQL Reference: нет Limit, Top, First, ... зарезервированные слова.

вы можете попытаться ограничить строки через предложение where,where sequence between 100 and 200. Но это нереальный сценарий.

первая работа вокруг С помощью курсора:

DECLARE ITERROWS INTEGER;
...
SET ITERROWS = 0;
DO WHILE (SUBSTR(SQLSTATE,1,2) = '00' and ITERROWS < 100
DO
    ...
    SET ITERROWS = ITERROWS + 1;

второе в язык промежуточного ПО.

Я надеюсь, что кто-то хитрый обходной путь, но, в на мой взгляд, нет.


решение только для > V4R4

используя FETCH FIRST [n] ROWS ONLY:

SELECT LASTNAME, FIRSTNAME, EMPNO, SALARY
  FROM EMP
  ORDER BY SALARY DESC
  FETCH FIRST 10 ROWS ONLY;

ссылка:publib.boulder.ibm.com

разница, которую я вижу из вашего запроса к этому примеру, заключается в том, что здесь мы используем ORDER BY предложение - у вас есть возможность добавить ORDER BY - Это следует сделать трюк. Ссылка на:https://stackoverflow.com/a/16858430/1581725


получить ряды или также только первые 10 строк, вы должны использовать ROW_NUMBER() (С v5r4):

SELECT 
    * 
FROM (
    SELECT ROW_NUMBER() OVER (ORDER BY {{table field}}) AS ROWNUM, * {{yourtable}}
) AS {{yourcursor}}
WHERE 
    {{yourcursor}}.ROWNUM>0 AND 
    {{yourcursor}}.ROWNUM<=10

ссылка:blog.zanclus.com