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

Oracle GROUP BY报错Expression not in GROUP BY key 'isin'修复咨询

报错原因

Oracle的GROUP BY语法规则要求:SELECT子句中所有未使用聚合函数的字段,必须全部包含在GROUP BY子句中。你当前SQL仅将stg.stocks_full_id设置为分组键,但SELECT列表中存在a.isin、a.state_number等大量非聚合字段未纳入分组逻辑,因此触发报错。

适配需求的修正逻辑

你的子查询a已经通过rank()窗口函数按isin、state_number分区取了最新的一行数据(过滤条件a.rn=1),且关联的trading_stocks、stocks_kinds表均与a.id一一对应,因此同一个stg.stocks_full_id对应的所有非聚合字段值都是唯一的,两种修正方式均可实现需求:

  • 方案1:将SELECT列表中所有非聚合字段全部添加到GROUP BY子句中
  • 方案2:用聚合函数包裹所有非聚合字段(同组值完全一致,聚合结果不会出现偏差,写法更简洁)
修正后参考代码(方案2为例)
SELECT MAX(a.isin) as id,
       MAX(a.state_number) as number,
       MAX(a.update_time) as valid_from_date,
       '2999-12-31 00:00:00' as valid_to_date,
       MAX(a.operdate) as oper,
       MAX(a.inn) as inn_num,
       MAX(a.name_eng) as name,
       MAX(coalesce(ts.full_name_eng,a.name_eng)) as full_nm,
       MAX(stg.end_circ) as end_date,
       MIN(stg.begin_circ) as start_date,
       MAX(case when sk.name_eng IS NULL then sk.name_uk else sk.name_eng end) as subtype_nm
FROM (SELECT s.*, rank() over (PARTITION BY isin,state_number ORDER BY operdate desc) as rn
      FROM stocks s 
      WHERE isin IS NOT NULL and state_number IS NOT NULL) a
JOIN trading_stocks ts ON ts.emission_is=a.id
JOIN stocks_trading_grounds stg ON stg.stocks_full_id=a.id
JOIN stocks_kinds sk ON sk.id=a.kind_id
WHERE stg.end_circ >= '2021-01-01 00:00:00' and a.rn=1
GROUP BY stg.stocks_full_id

注:额外修正了原SQL中字符串常量的引号问题,Oracle中字符串需用单引号包裹,双引号会被识别为对象名导致报错。

内容的提问来源于stack exchange,提问作者lisam

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 16:06:07