DB2中如何基于IDENTIFIER列使用fetch first x rows only获取关联数据
问题描述
想要基于IDENTIFIER列使用fetch first x rows only,但关联ABBRev表后结果出现重复(每个IDENTIFIER对应多条记录),导致fetch first x rows only直接截断了结果,无法获取前x个IDENTIFIER的所有关联记录。
原SQL语句:
SELECT IDENTIFIER, ABBREV FROM TABLE_A taba JOIN ABBREV abbrev ON abbrev.tablea_IDENTIFIER = taba.IDENTIFIER FETCH FIRST 2 ROWS ONLY
TABLE_A表结构:
| Identifier |
|---|
| 1 |
| 2 |
ABBRev表结构:
| abbrev | tablea_identifier |
|---|---|
| 'A' | 1 |
| 'B' | 1 |
| 'C' | 1 |
| 'A' | 2 |
期望结果:
| abbrev | IDENTIFIER |
|---|---|
| 'A' | 1 |
| 'B' | 1 |
| 'C' | 1 |
| 'A' | 2 |
解决方案
核心思路是先筛选出前x个IDENTIFIER,再关联ABBRev表,而非先关联再截断结果。以下是几种可行写法:
方法1:子查询筛选目标IDENTIFIER
先从TABLE_A中取出前x个IDENTIFIER,再与ABBRev关联,确保获取这些IDENTIFIER的所有关联记录:
SELECT taba.IDENTIFIER, abbrev.ABBREV FROM ( SELECT IDENTIFIER FROM TABLE_A FETCH FIRST 2 ROWS ONLY -- 此处控制取前2个IDENTIFIER ) taba JOIN ABBREV abbrev ON abbrev.tablea_IDENTIFIER = taba.IDENTIFIER
方法2:窗口函数标记目标IDENTIFIER
如果需要按特定规则排序后取前x个IDENTIFIER,可使用窗口函数实现:
SELECT IDENTIFIER, ABBREV FROM ( SELECT taba.IDENTIFIER, abbrev.ABBREV, -- 给每个IDENTIFIER分配全局排名 DENSE_RANK() OVER (ORDER BY taba.IDENTIFIER) AS identifier_rank FROM TABLE_A taba JOIN ABBREV abbrev ON abbrev.tablea_IDENTIFIER = taba.IDENTIFIER ) sub WHERE identifier_rank <= 2 -- 筛选前2个IDENTIFIER的所有记录
方法3:WITH子句提升可读性
用公共表表达式先定义目标IDENTIFIER集合,再关联查询,代码结构更清晰:
WITH target_identifiers AS ( SELECT IDENTIFIER FROM TABLE_A FETCH FIRST 2 ROWS ONLY ) SELECT ti.IDENTIFIER, a.ABBREV FROM target_identifiers ti JOIN ABBREV a ON a.tablea_identifier = ti.IDENTIFIER
内容的提问来源于stack exchange,提问作者mastermistik
相关产品推荐
相关产品推荐

