SOQL-запрос с подзапросом - PullRequest
       10

SOQL-запрос с подзапросом

8 голосов
/ 26 октября 2010

У меня проблемы с получением нужных результатов из запроса 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...

  1. Почему никакие объекты CampaignMember не возвращаются из подзапроса?
  2. Почему список контактов не фильтруется? (ну, очевидно, b / c, в нем нет предложения WHERE, но что предложение WHERE дает то, что я хочу?)

Я знаю, что мог бы сделать это, выполнив запрос CampaignMember сам по себе и пройдя по нему циклически, чтобы подготовить запрос Контакта, но это кажется большой дополнительной обработкой, когда подзапрос должен работать.

Спасибо!


Обновление

Объекты CampaignMember теперь отображаются - как ни странно - я, должно быть, исправил небольшую опечатку, не замечая этого (и да, они возвращают несколько столбцов, и это нормально).

Я все еще не могу понять, как отфильтровать запрос Контакта, хотя ...

1 Ответ

19 голосов
/ 27 октября 2010

Вы можете использовать полусоединение на контактах, чтобы отфильтровать контакты к нужному набору, как-то так

[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];

Еще один вариант - вместо кампании CampaignMeber.

[select contact.id, contact.firstname, contact.lastname, 
  status, comment__c, campaignId from campaignMembers 
  where contactId !='' and  campaignId in :cams];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...