You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 06:36:01