我无法从Salesforce / Apex / SOQL查询中获得我想要的结果。
我想:一个联系人对象列表,其中只包含一组广告系列的CampaignMembers的联系人;他们应该可以轻松访问该Campaign成员的数据。 (我的最终目标是一个VF页面,其中包含与所有这些广告系列相关联的所有联系人的列表,其中的网格指示了每个广告系列的状态。)
这些工作:
Campaign[] cams = [SELECT id, name
FROM Campaign
WHERE parentid = '70170000000LRIe'];
System.debug(cams);
// returns ~4 Campaign objects
CampaignMember[] cmembers = [SELECT id, status, contactid, campaignid
FROM CampaignMember
WHERE campaignid in :cams];
System.debug(cmembers);
// returns about 40 CampaignMember objects.
Contact[] members = [SELECT id, firstname, lastname,
(SELECT id, status, comment__c, campaignid
FROM Contact.CampaignMembers
WHERE campaignid in :cams)
FROM Contact];
System.debug(members);
// contains ALL Contacts in the DB, but I wanted filtered results.
System.debug(members[x].CampaignMembers);
// this is a contact I've verified has a qualifying CampaignMember, but the list is empty.
// UPDATE: CampaignMembers are now being returned, not sure what changed...
我知道我可以通过单独执行CampaignMember查询并循环遍历它来准备一个Contact查询来做到这一点,但是当子查询应该工作时,这似乎是很多额外的处理。
谢谢!
更新
CampaignMember对象现在正在显示 - 奇怪的是 - 我必须修复一些小错字而没有注意到(是的,它们返回多个列并且看起来很好)。
我仍然无法弄清楚如何过滤联系人查询,但是......
答案 0 :(得分:19)
您可以在联系人上使用半联接来将联系人过滤到您想要的集合,例如
[select id, firstname, lastname,
(select id, status, comment__c, campaignid from CampaignMembers)
from contact where id in
(select contactId from campaignMember where campaignId in :cams];
另一种选择是改为从campaignMmeber开车。
[select contact.id, contact.firstname, contact.lastname,
status, comment__c, campaignId from campaignMembers
where contactId !='' and campaignId in :cams];