Salesforce SOQL使用父对象引用字段GROUP BY报错解决方案咨询
报错原因
SOQL的GROUP BY子句不支持跨2层以上父关系引用非Id类型的字段,你当前语句中分组用到的Name、New_ID__c属于第三层父对象ASPO_Master__r的自定义/标准字段,不符合SOQL语法限制,因此触发报错
可行解决方案
方案1:Apex侧二次聚合(无数据修改成本,优先推荐)
你可以先按父对象Id分组完成聚合计算,再批量查询父对象的对应字段做关联匹配,全程无需修改现有数据结构,也不需要回填历史数据,实现逻辑如下:- 先按ASPO_Master__c的Id和UM__c完成分组聚合
List<AggregateResult> groupedResults = [ SELECT Delivery__r.Beneficiaire__r.ASPO_Master__c aspoMasterId, UM__c um, SUM(Quantity__c) qty FROM Item_Distributed__c WHERE Quantity__c !=0 AND Delivery__r.Beneficiaire__r.ASPO_Master__c !='' AND Del_Status__c='Delivered' AND Product__c IN :articleContainersId GROUP BY Delivery__r.Beneficiaire__r.ASPO_Master__c, UM__c ];- 批量查询所有聚合结果关联的ASPO_Master(Account)字段
Set<Id> aspoMasterIds = new Set<Id>(); for(AggregateResult ar : groupedResults){ aspoMasterIds.add((Id)ar.get('aspoMasterId')); } // 关联查询需要的父对象字段 Map<Id, Account> aspoMasterMap = new Map<Id, Account>([ SELECT Id, Name, New_ID__c FROM Account WHERE Id IN :aspoMasterIds ]);- 自定义Wrapper类组装最终需要的统计结构即可。
方案2:自定义字段批量回填(适合高频查询场景)
如果你需要频繁执行该统计逻辑,想要直接通过SOQL拿到结果,可以在Item_Distributed__c上新建ASPO_Master_Name__c、ASPO_Master_New_ID__c两个自定义字段,通过记录触发流/Process Builder实现新记录自动赋值,历史100万条数据不需要手动更新,使用官方Data Loader或者写Batch Apex后台批量回填即可,100万条记录的批量作业通常1-2小时即可完成,实施成本极低。方案3:使用标准报表(无代码场景)
如果该统计仅用于数据分析展示,不需要在Apex逻辑中调用,可以直接创建Item_Distributed__c对象的标准报表,报表天然支持跨多层父对象分组,无需代码或数据修改即可实现需求。
内容的提问来源于stack exchange,提问作者Girbson BIJOU
相关产品推荐
相关产品推荐

