SOQL带WHERE条件的嵌套子查询是否可在Salesforce中执行?
Salesforce SOQL嵌套子查询写法支持性解答
这种写法是被Salesforce支持的,但你的子查询逻辑存在冗余,同时需要确保对象关联关系配置正确,以下是具体分析和优化建议:
核心结论
SOQL允许在IN子句中使用返回单一字段的嵌套子查询,无论该字段是子查询对象的直接字段,还是其关联对象的跨对象字段,只要子查询返回的是合法的单字段值集合即可。
你的查询逻辑分析
你的子查询SELECT StandardField.Name FROM Obj2 WHERE StandardField.Id = :inputId存在逻辑冗余:因为StandardField.Id是唯一标识,所有符合条件的Obj2记录关联的都是同一个StandardField记录,所以子查询会返回多个重复的Name值,而IN条件会自动去重,实际效果等同于直接查询该StandardField的Name后用等于条件匹配。
优化写法建议
更高效的写法(推荐)
如果你的需求确实是匹配指定StandardField的Name,直接单独查询该记录的Name再用等于条件,性能更优:
// 先获取目标Name值 String targetStandardName = [SELECT Name FROM StandardField WHERE Id = :inputId].Name; // 主查询 List<Obj1> obj1Records = [ SELECT Field1__c FROM Obj1 WHERE Field1__c = :inputId2 AND Field2__c IN :inputFieldValues AND Parent__r.Parent2__r.Name = :targetStandardName ];
保留子查询的写法(适用于多Name值场景)
如果你的实际业务场景是子查询会返回多个不同的Name值(比如子查询条件不是Id = :inputId,而是其他范围条件),你的原写法是合法的,可直接使用:
List<Obj1> obj1Records = [ SELECT Field1__c FROM Obj1 WHERE Field1__c = :inputId2 AND Field2__c IN :inputFieldValues AND Parent__r.Parent2__r.Name IN ( SELECT StandardField.Name FROM Obj2 WHERE StandardField.Id = :inputId ) ];
注意事项
- 子查询必须返回单一字段,不能同时选择多个字段。
- 确保
Parent__r.Parent2__r的对象关联关系正确:Obj1的Parent__c字段需关联到某对象,该对象的Parent2__c字段需关联到拥有Name字段的对象。 - 注意Salesforce的SOQL查询行数限制,子查询的结果行数也会计入总查询行数。
内容的提问来源于stack exchange,提问作者binks29
相关产品推荐
相关产品推荐

