Apex如何查询同时关联指定名字Contact的Account ID(AND条件)
Salesforce 关联联系人全值匹配Account查询方案
需求与原有问题说明
需要检索符合要求的Account记录ID:目标Account关联的Contact记录,必须覆盖指定FirstName字符串集合的所有值。例如指定集合为{'Test','User'}时,要求Account下同时存在FirstName为Test的联系人、FirstName为User的联系人,仅匹配任意一个值的Account不符合要求。
原有代码的缺陷:原SOQL用单层子查询加IN匹配的逻辑属于或匹配规则,只要关联联系人的FirstName命中集合中任意一个值,对应Account就会被返回,无法实现全值匹配的AND要求。
可直接落地的实现方案
方案1:固定匹配值场景(性能最优)
当需要匹配的FirstName值固定、数量较少时,直接用多个AND连接的子查询做交集即可,数据库层直接完成过滤,执行效率最高:
List<Account> accountList = [ SELECT Id FROM Account WHERE Id IN (SELECT AccountId FROM Contact WHERE FirstName = 'Test') AND Id IN (SELECT AccountId FROM Contact WHERE FirstName = 'User') ];
方案2:动态匹配集合场景(通用性最强)
如果需要匹配的FirstName集合是动态传入、长度不固定,使用Contact聚合查询加HAVING计数过滤的方式实现,不需要硬编码条件:
List<String> names = new List<String>{'Test', 'User'}; Set<Id> validAccountIds = new Set<Id>(); // 聚合查询统计每个Account下命中集合内FirstName的去重数量 for(AggregateResult ar : [ SELECT AccountId accId FROM Contact WHERE FirstName IN :names AND AccountId != null GROUP BY AccountId // 去重计数等于集合总长度,说明覆盖了所有要求的名字 HAVING COUNT_DISTINCT(FirstName) = :names.size() ]){ validAccountIds.add((Id)ar.get('accId')); } // 查询最终符合要求的Account记录 List<Account> accountList = [SELECT Id FROM Account WHERE Id IN :validAccountIds];
补充说明:如果需求是FirstName包含指定字符串而非完全相等,只需要把上述代码中的等值/IN匹配替换为
LIKE模糊匹配即可。使用模糊匹配时建议做好字符串转义处理,规避SOQL注入风险。
内容的提问来源于stack exchange,提问作者Ruchi Sharma
相关产品推荐
相关产品推荐

