SOQL Abfrage mit Unterabfrage
-
26-09-2019 - |
Frage
Ich habe Probleme, die Ergebnisse, die ich von einem Salesforce / Apex / SOQL Abfrage möchten.
Ich möchte: Eine Liste von Kontaktobjekten, die nur Kontakte, die CampaignMembers einer Reihe von Kampagnen sind; und sie sollten die Daten von diesem Kampagnenelement leicht zugänglich sind. (Mein Endziel ist ein VF-Seite mit einer Liste aller auf jede dieser Kampagnen mit einem Netz verbunden Kontakte anzeigt, deren Status für jede Kampagne.)
Diese Arbeit:
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.
Hier ist mein Problem:
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...
-
Warum nicht CampaignMember aus der Unterabfrage zurückgegeben werden Objekte? - Warum wird die Kontaktliste gefiltert werden? (Na ja, offensichtlich b / c gibt es keine WHERE-Klausel drin, aber was WHERE-Klausel gibt, was ich will?)
Ich weiß, dass ich dies tun könnte die CampaignMember Abfrage auf seinem eigenen, indem Sie und Schleife durch eine Kontaktanfrag an prep, aber das scheint, wie viel zusätzliche Verarbeitung, wenn eine Unterabfrage funktionieren soll.
Danke!
Aktualisieren
Die CampaignMember Objekte jetzt zeigen sich - seltsam -. Ich ohne zu bemerken, einige kleine Tippfehler behoben haben muss (und ja, sie sind wiederkehr mehrere Spalten und das scheint in Ordnung zu sein)
Ich kann immer noch nicht herausfinden, wie die Kontaktanfrage zu filtern, obwohl ...
Lösung
Sie könnten ein Semi-Join auf Kontakte verwenden, um die Kontakte zu dem Satz zu filtern, die Sie wollen, so etwas wie diese
[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];
Eine andere Möglichkeit wäre, statt von campaignMmeber zu fahren.
[select contact.id, contact.firstname, contact.lastname,
status, comment__c, campaignId from campaignMembers
where contactId !='' and campaignId in :cams];