如何在Salesforce子查询中消除重名关系名的歧义
Salesforce SOQL 重名关联列表查询冲突解决
问题场景
- 对Opportunity对象做嵌套SOQL查询时,发现对象下存在两个同名关联子列表,现有查询语句默认匹配标准Quote对象的关联列表,无法返回自定义
Quote__c对象的关联数据 - 原查询语句:
SELECT ID, RecordType.Name, (SELECT Id, Line_of_Business__c FROM Quotes) FROM Opportunity
- 冲突原因:子查询使用的关系名
Quotes同时对应两个关联对象:- 标准Quote对象:系统原生关联,默认占用
Quotes关系名,查询优先级更高 - 自定义
Quote__c对象:自定义关联Opportunity时生成的默认子关系名和标准关系重名,被标准关系的优先级覆盖,无法直接通过Quotes访问
- 标准Quote对象:系统原生关联,默认占用
解决步骤
- 进入系统设置,打开自定义对象
Quote__c的字段管理页面,找到该对象上关联到Opportunity的查找/主从关系字段 - 打开该字段的详情页,查看**子关系名称(Child Relationship Name)**的配置值:如果和标准关系重名,系统要么自动为自定义关系生成带后缀的唯一可查询名,要么你可以直接修改这个子关系名称为不冲突的值,比如设置为
Custom_Quotes,保存后等待1-2分钟配置生效 - 自定义关系的子查询必须使用
[子关系名称]__r的格式,和不带__r后缀的标准关系做区分。
举个例子,如果你把自定义关系的子关系名改成了Custom_Quotes,调整后的正确查询语句为:SELECT Id, RecordType.Name, (SELECT Id, Line_of_Business__c FROM Custom_Quotes__r) FROM Opportunity
注意:不要直接套用示例里的关系名,必须以你当前组织内该自定义关系字段详情页标注的实际子关系名称为准,自定义关系查询必须拼接
__r后缀,这是和标准关系查询最直观的区别。
如果不想排查重名规则,最稳妥的方式就是直接修改自定义关联字段的子关系名称,从根源上避免和标准关系重名,后续查询也不会再出现匹配错对象的问题。
内容的提问来源于stack exchange,提问作者Dan Lambeth
相关产品推荐
相关产品推荐

