分类 默认分类 下的文章

半连接和反链接是SOQL里面一个宝,只要用的好,天天下班早

Semi-Join | 半连接

半连接(Semi-Join)指的是在SOQL语句的对比子句里面(也就是WHERE部分),使用子查询(subquery)的情况。

可能用到半连接的情况可能有:

  1. 获取某些具有特定阶段或者截至日期Opportunity的Account下面所有Contact信息
  2. 获取具有激活的Contract的Account下面所有的Opportunity信息

写法
有两种半连接:1)使用Id字段,2)使用外键(Lookup/Master-Detail关系等)

  1. 使用Id字段的半连接例子:

    SELECT Id, Name 
    FROM Account 
    WHERE Id IN 
      ( SELECT AccountId
     FROM Opportunity
     WHERE StageName = 'Closed Lost' 
      )
  2. 使用外键的半连接例子:

    SELECT Id
    FROM Task 
    WHERE WhoId IN 
      (
     SELECT Id
     FROM Contact
     WHERE MailingCity = 'Twin Falls'
      )

Anti-Join | 反连接

反连接(Anti-Join)与半连接非常类似,只是不同于半连接使用的比较关键字为IN, 反连接使用的比较关键字为NOT IN。其余部分包括写法、限制等是一致的,不再赘述。

两种写法

  1. 使用Id字段的半连接例子:

    ELECT Id, (Select Id, Amount, CloseDate FROM Opportunities)
    FROM Account
    WHERE Id NOT IN
      (
     SELECT AccountId
     FROM Contact
     WHERE LastName LIKE 'Trump%'
      )
  2. 使用外键的半连接例子:

    SELECT Id, Name, Phone, Email
    FROM Contact
    WHERE AccountId NOT IN 
      (
     SELECT AccountId
     FROM Opportunity
     WHERE CloseDate < Last_Week
      )

限制

  1. 在主语句的WHERE分句中,不能超过2INNOT IN语句
  2. 不能在半连接或者反连接前使用NOT操作符。若有这种情况,可以考虑把半连接转换为反连接,或者反连接转换为全连接
  3. 必须是Id字段或者外键,诸如... Where Account.Id IN (...)是非法的
  4. 子查询的查询字段必须与主查询对应的字段SObject一致,是且必须是对应的外键
  5. 子查询的字段条数不受限制,但是主查询条数仍收到限制
  6. 半连接或者反连接不能嵌套使用,即不能在半连接/反连接中再使用半连接或者反连接
  7. 子查询不能使用OR
  8. 子查询不支持COUNT, 'FOR UPDATE, ORDER BY, LIMIT`
  9. 下列对象不支持:

    • ActivityHistory
    • Attachments
    • Event
    • EventAttendee
    • Note
    • OpenActivity
    • Tags (AccountTag, ContactTag, and all other tag objects)
    • Task

详情可以查看SOQL and SOSL Reference以下章节:
Semi-Joins with IN and Anti-Joins with NOT IN

NOTE: this article is not the final version and will be update later

AttachedContentNote

  • This read-only object contains all ContentNote objects associated with an object. This object is available in API version 35.0 and later.
  • link to developer.salesforce.com

ActivityHistory

  • This read-only object is displayed in a related list of closed activities—past events and closed tasks—related to an object. It includes activities for all contacts related to the object. ActivityHistory fields for phone calls are only available if your organization uses Salesforce CRM Call Center.
  • link to ActivityHistory on developer.salesforce.com

Salesforce inline editing是非常方便的功能,可以提供方便的在视图中编辑和保存字段的功能。

但是好东西不是十全十美的,它有些限制:
Guidelines for Editing Records with the Inline Editor

而对于列表视图(lists),有下面限制:

  1. 某些标准字段并不支持,比如:Case Status, Opportunity Stage, Opportunity Amount, Opportunity Quantity and Lead Status, and most Task and Event fields只能在记录编辑页面编辑.
  2. 如果org使用了记录类型,则必须保证视图里面的列出的记录全部属于同一个记录类型。换而言之,必须使用记录类型作为筛选条件,同时最多选择一个类型或者留空(对于主记录类型)
  3. 在筛选条件的逻辑里面,不能包含或(OR)从句(clause)
  4. 对于活动(Activities)则必须有额外的筛选,指定任务(Task)为真(True)或者为假(False)

更多信息,可以参考Salesforce英文说明:Editing Records Directly From Enhanced Lists