Oracle SQL语句中MAX(woq.wq_version)函数失效返回多条结果问题
问题产生原因
- GROUP BY字段配置错误:你将
wq_version、quote_amount都加入了分组字段,SQL会按三个字段的唯一组合拆分分组,每个分组独立计算MAX(wq_version),结果就是每个分组自己的版本号,HAVING woq.wq_version = MAX(woq.wq_version)对所有分组都成立,自然返回多个分组结果。 - 连接逻辑冗余:你写了
LEFT JOIN之后又在WHERE条件中添加了woq.woo_auto_key = smh.woo_auto_key,相当于把左连接强制转换为内连接,属于无效冗余逻辑。
修复方案
方案1:Oracle 12c及以上版本(语法更简洁)
直接按版本号倒序排序后取第一条记录即可:
SELECT woq.wo_number, woq.quote_amount, woq.wq_version version FROM ba_view_wo_quote woq INNER JOIN sm_header smh ON woq.woo_auto_key = smh.woo_auto_key WHERE woq.wo_number = 'WO1110885' AND woq.quote_amount <> '0' ORDER BY woq.wq_version DESC FETCH FIRST 1 ROW ONLY;
方案2:全版本兼容(窗口函数实现)
如果需要兼容12c以下的Oracle版本,可以用ROW_NUMBER窗口函数实现:
SELECT wo_number, quote_amount, wq_version version FROM ( SELECT woq.wo_number, woq.quote_amount, woq.wq_version, ROW_NUMBER() OVER(ORDER BY woq.wq_version DESC) rn FROM ba_view_wo_quote woq INNER JOIN sm_header smh ON woq.woo_auto_key = smh.woo_auto_key WHERE woq.wo_number = 'WO1110885' AND woq.quote_amount <> '0' ) t WHERE rn = 1;
如果最高版本存在多条同版本报价记录,将ROW_NUMBER替换为RANK即可返回所有最高版本记录
内容的提问来源于stack exchange,提问作者Faustino Lopez
相关产品推荐
相关产品推荐

