DB2使用LIMIT和OFFSET

10
我正在开发一个Java Web服务,从IBM Mid Range机器(AS400)的DB2数据库中获取大数据集时允许分页。例如:如果数据集中有10000条记录,我希望每次以1000个块的方式获取它们。
我找到了这篇article,解释了我可以使用LIMIT和OFFSET。但是我需要设置DB2_COMPATIBILITY_VECTOR变量为MYS
现在我一直在谷歌搜索,看到可以使用db2set来设置这个变量。但我还没有找到在哪里输入这个命令?
我正在Windows机器上开发,并安装了iSeries,通过iSeries 5250模拟器访问IBM Mid Range机器。
我知道这一定是一个非常初级的问题,但我该如何改变DB2_COMPATIBILITY_VECTOR变量为MYS

这是DB2 for i (V6R1)的文档,链接如下:http://pic.dhe.ibm.com/infocenter/iseries/v6r1m0/index.jsp?topic=/db2/rbafzintro.htm。正如Leons所指出的,您需要使用`ROW_NUMBER`函数。 - Benny Hill
你应该在IBM i上使用Java和JTOpen工具箱的JDBC驱动程序。 - James Allman
@JamesA,是的,我正在使用JTOpen。但我不知道如何使用它来允许分页? - ZioN
据我所知,实际答案是“对于版本6.1的DB2 for i来说,你不能这样做。但如果你想输入命令,可以在同一个命令行中输入其他db2*命令,例如db2stop和db2start。” - user2338816
2个回答

13

自IBM i 7.1 TR11或IBM i 7.2 TR3起,现在支持正常的现代分页方式,使用LIMIT/OFFSET

SELECT SalesOrderId,OrderDate,DueDate,ShipDate,
       Status,CustomerId,SubTotal,TaxAmt
  FROM SalesOrderHeader SOH
 WHERE CustomerId=@CustomerId
ORDER BY SalesOrderId DESC
 LIMIT @ROWS_PER_PAGE      -- Variable = 10
OFFSET @PAGE_START_ROW     -- Variable = 10 * Page Number

有关详情请参阅此文章...


12

DB2 for Linux Unix Windows (LUW)和DB2 for iSeries是不同的产品。很可能,DB2 for iSeries不支持DB2_COMPATIBILITY_VECTOR。我无法在iSeries信息中心中找到它的提及。

您可以使用FETCH FIRST 10 ROWS ONLY子句代替LIMIT。

您可以使用带有ROW_NUMBER排列函数的子查询来代替LIMIT和OFFSET。类似以下内容:

 SELECT emp.EMPNO, emp.SALARY
 FROM (

     SELECT EMPNO, SALARY, 
            ROW_NUMBER() OVER(ORDER BY SALARY DESC) as row_number
     FROM EMPLOYEE

 ) emp
 WHERE emp.row_number > 10
 AND emp.row_number <= 20

1
我遇到了这个解决方案,但是性能非常慢,我希望能找到更快的解决方案。 - ZioN
1
很遗憾,我开始相信这可能是唯一的方法:https://dev59.com/A2865IYBdhLWcg3wTctY - ZioN
3
许多“SQL查询速度太慢”的问题可以通过适当的索引来解决。在IBM i Navigator中运行索引顾问,然后创建推荐的索引。 - Buck Calabro
1
需要注意的是,ROW_NUMBER() 函数有一些限制之一是不允许使用视图。 - ZioN
1
@ZioN 我正在使用 IBM i v6r1,并且可以毫无问题地在视图上使用 ROW_NUMBER() 函数。 - Mirco
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接