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

如何在Salesforce中编写跨多个对象的SOQL关联查询

核心逻辑说明

SOQL不支持SQL风格的显式LEFT JOIN语法,所有关联查询分为两类,结合你的场景说明如下:

  • 子到父查询:主对象为子对象,通过关系字段API名__r.父对象字段的格式直接向上获取父对象字段,支持最多5级跨对象,默认是左连接逻辑
  • 父到子查询:主对象为父对象,在SELECT中嵌套子查询,通过子关系名获取关联的子对象字段,没有关联记录时返回空列表

你之前报错的原因是将关联子查询写在了WHERE子句中,WHERE中的半连接子查询仅支持过滤数据,无法用来获取关联对象的字段,也不支持嵌套额外的查询逻辑。


两种写法方案

方案1:以Contact为主对象(保留无关联Account的Contact记录)

对应你原SQLLEFT JOIN的逻辑,保留所有Contact,不管有没有关联的Account记录,写法如下:

注意:请先确认两个关系名的实际API值:

  • Contact上关联User的查找字段API名,示例假设为Oid__c,对应关系名为Oid__r
  • 关联对象account_contact__c中关联Contact的字段的「子关系名称」,可通过对象管理器查看该字段详情获取,示例假设为Account_Contacts__r
SELECT 
    Id,
    fname__c, /* 自定义字段请替换为实际API名,标准姓名字段为FirstName */
    lname__c, /* 自定义字段请替换为实际API名,标准姓名字段为LastName */
    Oid__r.Name, /* 对应原SQL中关联User的name字段 */
    (
        SELECT 
            Desc__c, /* 对应account_contact__c的desc字段 */
            Account_Id__r.RecordType.CreatedDate /* 替换为你RecordType上实际的日期字段API名,Account_Id__r为account_contact__c上关联Account的关系名 */
        FROM Account_Contacts__r /* 替换为实际的子关系名 */
        WHERE Account_Id__r.RecordType.DeveloperName = 'test'
    )
FROM Contact

输出说明:子查询返回的是List结构,因为一个Contact可关联多个Account,需要遍历子列表取值。


方案2:以account_contact__c为主对象(结果打平,仅保留有Account关联的记录)

如果你不需要保留无关联Account的Contact,需要输出和原SQL一致的打平单行结构,用子到父查询写法更简单:

SELECT
    Contact__r.Id,
    Contact__r.fname__c,
    Contact__r.lname__c,
    Contact__r.Oid__r.Name,
    Desc__c,
    Account_Id__r.RecordType.CreatedDate
FROM Account_Contact__c
WHERE Account_Id__r.RecordType.DeveloperName = 'test'

输出说明:每一行对应一条account_contact__c记录,所有关联字段直接打平返回,和原SQL输出结构一致。


注意事项

  • 所有自定义字段、关系名请以你Org中实际的API名称为准,区分大小写
  • 筛选记录类型时优先用DeveloperName(API名,无空格、不会随本地化修改),不要用Name(显示名)
  • 如果需要保留无关联Account的Contact同时还要打平结果,需要先查Contact再遍历关联子列表自行拼接

内容的提问来源于stack exchange,提问作者Uday

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 13:30:00