带子查询的SOQL查询

Ben*_*enj 8 salesforce soql apex-code

我无法从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.
Run Code Online (Sandbox Code Playgroud)

这是我的问题:

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...
Run Code Online (Sandbox Code Playgroud)
  1. 为什么没有从子查询返回任何CampaignMember对象?
  2. 为什么不过滤联系人列表?(嗯,很明显B/C有一个在它没有WHERE子句,但什么WHERE子句提供我想要什么?)

我知道我可以通过单独执行CampaignMember查询并循环遍历它来准备一个Contact查询来做到这一点,但是当子查询应该工作时,这似乎是很多额外的处理.

谢谢!


更新

CampaignMember对象现在出现了 - 奇怪的是 - 我必须修复一些小错字而没有注意到(是的,它们返回多个列并且看起来很好).

我仍然无法弄清楚如何过滤联系人查询,但...

sup*_*ell 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];
Run Code Online (Sandbox Code Playgroud)

另一种选择是从campaignMmeber开车.

[select contact.id, contact.firstname, contact.lastname, 
  status, comment__c, campaignId from campaignMembers 
  where contactId !='' and  campaignId in :cams];
Run Code Online (Sandbox Code Playgroud)