相当于LIMIT for DB2

elc*_*ool 89 db2 limit ibm-midrange

你如何LIMIT在DB2 for iSeries中做到这一点?

我有一个超过50,000条记录的表,我想将记录0到10,000,并记录10,000到20,000.

我在SQL中知道你LIMIT 0,10000在查询结束时写入0到10,000,LIMIT 10000,10000在查询结束时写入 10000到20,000

那么,这在DB2中是如何完成的?什么是代码和语法?(完整的查询示例表示赞赏)

Joe*_*Joe 138

使用FETCH FIRST [n] ROWS ONLY:

http://publib.boulder.ibm.com/infocenter/dzichelp/v2r2/index.jsp?topic=/com.ibm.db29.doc.perf/db2z_fetchfirstnrows.htm

SELECT LASTNAME, FIRSTNAME, EMPNO, SALARY
  FROM EMP
  ORDER BY SALARY DESC
  FETCH FIRST 20 ROWS ONLY;
Run Code Online (Sandbox Code Playgroud)

要获得范围,你必须使用ROW_NUMBER()(从v5r4开始)并在WHERE条款中使用:(从这里偷来:http://www.justskins.com/forums/db2-select-how-to-123209.html )

SELECT code, name, address
FROM ( 
  SELECT row_number() OVER ( ORDER BY code ) AS rid, code, name, address
  FROM contacts
  WHERE name LIKE '%Bob%' 
  ) AS t
WHERE t.rid BETWEEN 20 AND 25;
Run Code Online (Sandbox Code Playgroud)

  • 您必须使用ROW_NUMBER执行类似的操作:http://www.justskins.com/forums/db2-select-how-to-123209.html (2认同)

elc*_*ool 13

开发此方法:

您需要一个具有可订购的唯一值的表.

如果您想要行10,000到25,000并且您的表有40,000行,首先需要获取起点和总行数:

int start = 40000 - 10000;

int total = 25000 - 10000;

然后通过代码将这些传递给查询:

SELECT * FROM 
(SELECT * FROM schema.mytable 
ORDER BY userId DESC fetch first {start} rows only ) AS mini 
ORDER BY mini.userId ASC fetch first {total} rows only
Run Code Online (Sandbox Code Playgroud)


Kev*_*ler 9

最近在DB2 for i 7.1和7.2中添加了对OFFSET和LIMIT的支持.您需要以下DB PTF组级别才能获得此支持:

  • SF99702等级9适用于IBM i 7.2
  • IBM i 7.1的SF99701 38级

有关更多信息,请参见此处:OFFSET和LIMIT 文档,DB2 for i Enhancement Wiki


Tom*_*ron 6

这是我提出的解决方案:

select FIELD from TABLE where FIELD > LASTVAL order by FIELD fetch first N rows only;
Run Code Online (Sandbox Code Playgroud)

通过将LASTVAL初始化为0(或"对于文本字段"),然后将其设置为最新记录集中的最后一个值,这将在N个记录的块中逐步执行该表.