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

时间:2015-04-10 05:44:04

标签: sql db2

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

如何仅针对DB2 AS400限制我的查询示例100行?

FETCH FIRST n ROWS ONLY

ROW_NUMBER()

不行。

任何想法或解决方法?

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

SELECT POLNOP FROM ZICACPTF.POLHDR FETCH FIRST 10 ROWS ONLY

它说

  

[SQL0199]不期望关键字FETCH。有效令牌:FOR FOR ORDER UNION OPTIMIZE。

2 个答案:

答案 0 :(得分:2)

此操作没有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;

第二个,使用中间件语言

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

答案 1 :(得分:0)

仅针对&gt;的解决方案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