DB2使用LIMIT和OFFSET

Zio*_*ioN 6 sql db2 ibm-midrange sql-limit

我正在开发一个Java Web服务,允许在从IBM Mid Range Machine(AS400)上的DB2数据库中获取大数据集时进行分页.

例如; 如果数据集中有10000条记录,我想一次以1000块为单位获取它们.

我发现这篇文章解释说我可以使用LIMIT和OFFSET.但我需要将DB2_COMPATIBILITY_VECTOR变量设置为MYS.

现在我一直在谷歌搜索,看到你可以db2set用来设置这个变量.但是我无法找到在哪里键入此命令?

我正在开发一台Windows机器,我安装了iSeries,并且可以通过iSeries 5250仿真器访问IBM Mid Range Machine.

我知道这一定是一个真正的菜鸟问题,但我如何将DB2_COMPATIBILITY_VECTOR变量更改为MYS

Leo*_*ons 9

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

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

您应该能够使用带有ROW_NUMBER olap函数的子选择,而不是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
Run Code Online (Sandbox Code Playgroud)

  • 许多"这个SQL太慢"的问题可以通过适当的索引来解决.在IBM i Navigator中运行索引顾问,然后创建建议的索引. (3认同)

sve*_*hie 8

从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
Run Code Online (Sandbox Code Playgroud)

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