在单个SOQL查询中包含其他条件

时间:2013-06-13 23:49:28

标签: salesforce soql

我有一个SOQL构建如下:

SELECT Subject, IsChild, StartDateTime, Owner.UserName, Owner.Email, Notes_Universal_ID__c, Location, IsPrivate, IsDeleted, Id, EndDateTime, Description, ShowAs, (SELECT Id, Status, Response, EventId, RelationId, Relation.Email FROM EventRelations) FROM Event where Subject = 'Test Meeting 3' and IsChild = false

在同一个查询中,我正在寻找对所有者和参加者的User对象执行额外检查Sync_contacts_and_cal_with_Notes__c = true

是否可以,有人可以帮我查询一下吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

这会有点棘手。

基本思路很简单,只需添加2个WHERE子句。 (我正在跳过大部分字段,因此更改更明显):

SELECT Subject, Owner.UserName, Owner.Email,
    (SELECT Status, Response, RelationId, Relation.Email 
    FROM EventRelations
    WHERE Relation.Sync_contacts_and_cal_with_Notes__c = true)
FROM Event 
WHERE Subject = 'Test Meeting 3' AND IsChild = false
    AND Owner.Sync_contacts_and_cal_with_Notes__c = true

但是,这会过滤两个表。

2个用户:“Alice”没有勾选复选框,“Bob”有。

如果你有一个由“爱丽丝”拥有的活动 - 即使“鲍勃”是其中一些人的参加者之一,他也不会同步所有活动,而且他希望看到它们!


一种方法是简单地在SELECT中包含标志,并手动过滤代码中的记录。

另一个选择是反转关系,从EventAttendee开始查找并有一个OR过滤器:

SELECT Status, RelationId, RelationEmail, 
    Event.OwnerId, Event.Owner.Email
FROM EventAttendee
WHERE Owner.Sync_contacts_and_cal_with_Notes__c = true
    OR Event.Owner.Sync_contacts_and_cal_with_Notes__c = true
ORDER BY Event

这是更好但不理想,因为现在我们永远不会看到没有任何与会者的活动......


编辑回答评论:

  1. 根据您使用的API版本,您会看到EventAttendees或EventRelations,我以为我们在上一个问题中已经介绍过了?只需相应地替换表名和字段名。

  2. 关于错误 - 真的很奇怪!它似乎很乐意接受标准用户字段,但是当你开始使用自定义字段时会变得很愚蠢。解决问题的一种方法是联系SF支持并选择加入“多态SOQL”(How to get Email from Task object record using SOQL)。

  3. 另一种方法 - 您必须将其拆分为2个查询,首先获取选中复选框的用户ID,然后在WHERE OwnerId IN :(set of these id's here)中使用它们。

    那,或者:

    SELECT Subject, Owner.UserName, Owner.Email,
        (SELECT Status, Response, RelationId, Relation.Email 
        FROM EventRelations
        WHERE RelationId IN (SELECT Id FROM User WHERE Checkbox__c = true))
    FROM Event 
    WHERE IsChild = false
        AND OwnerId IN (SELECT Id FROM User WHERE Checkbox__c = true)
    
    1. 如果我没记错,小孩Events设置了ReccurenceActivityId