题
我有麻烦的结果,我想从一个Salesforce/Apex/SOQL查询。
我想: 一个列表的联络对象仅包含的联系人是谁CampaignMembers的一组活动;他们应该有的数据从这场运动的成员很容易地访问。(我的最终目标是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对象正在返回的查询?- 为什么不接触列正在过滤?(嗯,很明显b/c没有其中的条款,但是其条款提供了什么我想要什么?)
我知道我可以做该做的CampaignMember查询关于其自己的和循环,通过它为准备联系人查询,但这似乎是一个很大的额外处理时查询该工作。
谢谢!
更新
该CampaignMember的对象是现在显示出来的-奇怪-我必须有固定的一些小的错误而没有注意到(以及是的,他们是返回多列,似乎是优良)。
我仍然无法找出如何过滤器的联系的查询,虽然...
解决方案
你可以用一半的加入关于接触到的过滤器的联系到你想要的,像这样的东西
[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];
不隶属于 StackOverflow