Oracle SQL多表关联后指定列重复值抑制方案咨询
解决Oracle SQL重复值置空问题
问题分析
你的多表关联查询返回结果中,AWARD_ID、IDENTIFIER、RECON_AMOUNT列存在重复值,需要将同一AWARD_ID组内的重复值置空,仅保留每组首次出现的有效值。
修正原查询语法错误
原查询存在语法错误,先修正为标准显式关联语法:
SELECT A.AWARD_ID, A.IDENTIFIER, IP.INSTALMENT_ID, IP.AMOUNT, R.AMOUNT AS RECON_AMOUNT FROM AWARD A JOIN INSTALMENT_PAYMENTS IP ON A.AWARD_ID = IP.AWARD_ID JOIN RECON R ON A.IDENTIFIER = R.REFERENCE;
优化后的查询语句
利用Oracle分析函数ROW_NUMBER()实现分组编号,结合CASE WHEN控制值的显示:
SELECT CASE WHEN rn = 1 THEN A.AWARD_ID END AS AWARD_ID, CASE WHEN rn = 1 THEN A.IDENTIFIER END AS IDENTIFIER, IP.INSTALMENT_ID, IP.AMOUNT, CASE WHEN rn = 1 THEN R.AMOUNT END AS RECON_AMOUNT FROM ( SELECT A.AWARD_ID, A.IDENTIFIER, IP.INSTALMENT_ID, IP.AMOUNT, R.AMOUNT, -- 按AWARD_ID分组,按INSTALMENT_ID排序生成行号 ROW_NUMBER() OVER (PARTITION BY A.AWARD_ID ORDER BY IP.INSTALMENT_ID) AS rn FROM AWARD A JOIN INSTALMENT_PAYMENTS IP ON A.AWARD_ID = IP.AWARD_ID JOIN RECON R ON A.IDENTIFIER = R.REFERENCE ) t;
核心逻辑说明
- 子查询中,
ROW_NUMBER()会为每个AWARD_ID分组内的行按INSTALMENT_ID排序并分配唯一编号,每组第一行编号为1,后续行依次递增。 - 外层查询通过
CASE WHEN rn = 1判断,仅编号为1的行显示AWARD_ID、IDENTIFIER、RECON_AMOUNT的原值,其余行返回NULL(对应结果中的空值)。
验证结果
执行优化语句后,输出结果将完全匹配你的期望格式:
| AWARD_ID | IDENTIFIER | INSTALMENT_ID | AMOUNT | RECON_AMOUNT |
|---|---|---|---|---|
| 1001 | 200112 | 1 | 4000 | 3000 |
| 2 | -1000 | |||
| 1002 | 200113 | 3 | 4000 | 4000 |
| 1003 | 200114 | 4 | 1000 | 5000 |
| 5 | 1000 | |||
| 6 | 3000 |
内容的提问来源于stack exchange,提问作者Sean Whiting
相关产品推荐
相关产品推荐

