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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 21:15:24