SOQL Consulta com subconsulta
-
26-09-2019 - |
Pergunta
Estou tendo problemas para obter os resultados que quero de uma consulta Salesforce/Apex/Soql.
Eu quero: Uma lista de objetos de contato contendo apenas contatos que são membros de campanhas de um conjunto de campanhas; E eles devem ter os dados desse membro da campanha facilmente acessíveis. (Meu objetivo eventual é uma página VF com uma lista de todos os contatos conectados a qualquer uma dessas campanhas com uma grade indicando seu status para cada campanha.)
Estes trabalham:
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.
Aqui está o meu problema:
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...
Por que nenhum objetivo de campanha não está sendo devolvido da subconsulta?- Por que a lista de contatos não está sendo filtrada? (Bem, obviamente, b/c não há cláusula nela, mas o que a cláusula fornece o que eu quero?)
Sei que poderia fazer isso fazendo a consulta do membro de campanha por conta própria e percorrendo -a para preparar uma consulta de contato, mas isso parece muito processamento extra quando uma subconsulta deve funcionar.
Obrigado!
Atualizar
Os objetos do membro de campanha agora estão aparecendo - estranhamente - devo ter corrigido alguns erros de digitação sem perceber (e sim, eles estão retornando várias colunas e isso parece estar bem).
Ainda não consigo descobrir como filtrar a consulta de contato ...
Solução
Você pode usar uma semi-joa nos contatos para filtrar os contatos para o conjunto que você deseja, algo assim
[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];
Outra opção seria dirigir da CampaignMMeber.
[select contact.id, contact.firstname, contact.lastname,
status, comment__c, campaignId from campaignMembers
where contactId !='' and campaignId in :cams];