SQL DB2 的查询限制 AS/400 版本 4

SQL Query Limit for DB2 AS/400 Version 4

我知道版本太旧了(是的第 4 版!),但我别无选择。

如何限制我的查询,例如 DB2 AS400 的 100 行?

FETCH FIRST n ROWS ONLY

ROW_NUMBER()

不工作。

有什么想法或解决方法吗?

这是一个示例 SQL 查询(不起作用):

SELECT POLNOP FROM ZICACPTF.POLHDR FETCH FIRST 10 ROWS ONLY

它说

[SQL0199] Keyword FETCH not expected. Valid tokens: FOR WITH ORDER UNION OPTIMIZE.

解决方案仅适用于 > 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 - 它应该可以解决问题。参考:


要获取范围或仅获取前 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

没有dbms支持这个操作,检查Version 4 DB2 UDB for AS/400 SQL Reference:没有LimitTopFirst,...保留字。

您可以尝试通过 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;

第二个,使用您的中间件语言

我希望有人 post 有一个聪明的解决方法,但在我看来,他们不是。