IBM DB2中Fetch Multiple Rows获取Employee表前2行数据方法
DB2 多行抓取实现方案
问题说明
需求为在IBM DB2数据库中实现Fetch Multiple Rows(多行数据抓取),从Employee表中获取对应结果。
源表数据如下:
EE_No. STATE 1. Arizona 2. Arizona 3. Arizona 4. New Mexico 5. New Mexico
预期查询结果:
1. Arizona 2. Arizona 4. New Mexico 5. New Mexico
当前SQL的问题
你当前编写的SQL存在4个问题,无法得到预期结果:
Select Distinct Ee-id State From Emloyee Order by ee_no FETCH FIRST 2 ROWS ONLY
- 语法错误:查询多列时未加逗号分隔,
Ee-id和State之间缺少逗号,直接运行会报语法错误 - 拼写错误:表名
Emloyee拼写错误,正确表名为Employee;列名Ee-id和源表字段EE_No不匹配 - 逻辑错误:
FETCH FIRST 2 ROWS ONLY是全局截取排序后的前2行,运行后只会返回EE_No为1、2的两条Arizona数据,无法返回New Mexico的两条数据,和预期结果不符 - 冗余用法:这里不需要加
DISTINCT去重,加了反而可能干扰排序逻辑,导致结果异常
正确实现代码
DB2支持通过窗口函数ROW_NUMBER()实现分组取Top N的需求,正确SQL如下:
SELECT EE_No, STATE FROM ( SELECT EE_No, STATE, ROW_NUMBER() OVER (PARTITION BY STATE ORDER BY EE_No) AS row_rank FROM Employee ) t WHERE row_rank <= 2 ORDER BY EE_No
逻辑说明
- 子查询中通过
PARTITION BY STATE按STATE字段分组,每个分组内按EE_No升序排列,为每一行生成从1开始的分组内序号 - 外层查询过滤分组序号≤2的行,即每个STATE取EE_No最小的前2条记录
- 最终按EE_No全局排序,即可得到预期的4条结果
注意:ROW_NUMBER()窗口函数在DB2 V8及以上版本均支持,属于通用标准SQL写法,兼容性好。
内容的提问来源于stack exchange,提问作者Db2 novice
相关产品推荐
相关产品推荐

