我有一个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
。
是否可以,有人可以帮我查询一下吗?
谢谢!
答案 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
这是更好但不理想,因为现在我们永远不会看到没有任何与会者的活动......
编辑回答评论:
根据您使用的API版本,您会看到EventAttendees或EventRelations,我以为我们在上一个问题中已经介绍过了?只需相应地替换表名和字段名。
关于错误 - 真的很奇怪!它似乎很乐意接受标准用户字段,但是当你开始使用自定义字段时会变得很愚蠢。解决问题的一种方法是联系SF支持并选择加入“多态SOQL”(How to get Email from Task object record using SOQL)。
另一种方法 - 您必须将其拆分为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)
ReccurenceActivityId
。