Skip to main content

Erstellen von Beziehungsabfragen mit Standardobjekten

Lernziele

Nachdem Sie diese Lektion abgeschlossen haben, sind Sie in der Lage, die folgenden Aufgaben auszuführen:

  • Beschreiben der beiden Typen von Beziehungsabfragen
  • Bestimmen der Beziehung zwischen zwei Objekten
  • Erstellen einer Abfrage einer Unter-/Überordnungsbeziehung mithilfe der Punktnotation
  • Erstellen einer Abfrage einer Über-/Unterordnungsbeziehung mithilfe einer Unterabfrage
  • Filtern von Abfrageergebnissen mit einer Unterabfrage

Mit Trail Together einem Dozenten folgen

Möchten Sie bei diesem Schritt einem Experten folgen? Schauen Sie sich dieses Video an, das Teil der Reihe "Trail Together" auf Trailhead Live ist.

(Dieser Clip beginnt bei Minute 36:18, für den Fall, dass Sie zurückspringen und den Anfang des Schritts noch einmal sehen möchten.)

Informationen zu Beziehungsabfragen

Als Salesforce-Administrator sind Sie bereits mit Formelfeldern vertraut, die Daten aus verwandten Datensätzen abrufen. Jetzt können Sie Ihr Wissen über Objektbeziehungen auf das Schreiben von SOQL-Abfragen anwenden.

Obwohl die FROM-Klausel auf ein Objekt begrenzt ist, können wir mit einer Beziehungsabfrage auf zwei verwandte Objekte zugreifen. Eine Beziehungsabfrage nutzt die Beziehung zwischen zwei verschiedenen Objekten, um Felder aus beiden Objekten zurückzugeben. Sie können sich das wie eine objektübergreifende Abfrage vorstellen.

Sehen wir uns diese Anforderung an:

"Eine Liste aller Kontakte mit dem Accountnamen der einzelnen Kontakte abrufen."

Wir können das Objekt "Kontakt" abfragen, aber es enthält nicht das Feld "Accountname". Der Accountname ist tatsächlich das Feld "Name" im Account, der mit dem Kontakt verknüpft ist. In einer Organisation greifen Sie mithilfe eines Formelfelds auf ein Feld in einem beliebigen verwandten Objekt zu. In Apex arbeiten Sie mit einer Beziehungsabfrage, aber deren Typ hängt davon ab, in welcher Beziehung die beiden Objekte zueinander stehen.

Zum Abrufen von Datensätzen für ein

  • untergeordnetes Objekt und Einbeziehen von Feldern aus einem verwandten übergeordneten Objekt verwenden Sie eine Abfrage einer Unter-/Überordnungsbeziehung.
  • übergeordnetes Objekt und Einbeziehen von Feldern aus einem verwandten untergeordneten Objekt verwenden Sie eine Abfrage einer Über-/Unterordnungsbeziehung.

Ehe wir entscheiden können, welchen Abfragetyp wir wählen, müssen wir wissen, in welcher Beziehung unsere beiden Objekte, "Kontakt" und "Account", zueinander stehen. Welches ist über- und welches untergeordnet?

Bestimmen der Beziehung der Objekte

Als Administrator sind Sie mit Master-Detail-Beziehungen in einer Organisation vertraut. Eine Master-Detail-Beziehungen ist eine Über-/Unterordnungsbeziehung. Das Master-Objekt ist das übergeordnete, das Detail-Objekt das untergeordnete Objekt. Wenn die beiden Objekte, die Sie in eine Abfrage einbeziehen möchten, eine Master-Detail-Beziehung haben, wissen Sie, welches das übergeordnete und welches das untergeordnete Objekt ist.

Hinweis

Eine Master-Detail-Beziehungen ist eine 1:n-Beziehung. Das (übergeordnete) Master-Objekt kann viele (untergeordnete) Detail-Objekte haben, aber jedes (untergeordnete) Detail-Objekt hat nur ein (übergeordnetes) Master-Objekt.

Wenn Sie mit den beiden Objekten, die Sie in eine Abfrage einbeziehen möchten, nicht vertraut sind oder nicht wissen, in welcher Beziehung sie stehen, erkunden Sie die Objekte im Objekt-Manager. Beginnen Sie mit dem Objekt, bei dem die Wahrscheinlichkeit am größten ist, dass es sich um das untergeordnete Objekt handelt, und sehen Sie sich dessen Feld "Felder & Beziehungen" an. Suchen Sie einen Feldnamen, der mit dem übergeordneten Objekt verbunden sein könnte.

"Contact" enthält z. B. das Feld "AccountId" mit dem Datentyp "Lookup(Account)". Denken Sie daran, dass wir im Code den Feldnamen (AccountId) benötigen, nicht die Feldbezeichnung (Accountname).

Die Seite 'Felder & Beziehungen' im Objekt-Manager für das Objekt 'Contact' mit Hervorhebung eines Felds. Feldbezeichnung = Account Name Feldname = AccountId Datentyp = Lookup(Account)

In den Details des Felds "AccountId" lautet der Name der untergeordneten Beziehung "Contacts" (im Plural). Standardmäßig ist der Beziehungsname für Standardobjekte die Pluralform des Namens des untergeordneten Objekts.

Details für das Feld 'Account Name' im Objekt 'Contact', wobei 'Name der untergeordneten Beziehung' hervorgehoben ist, nämlich 'Contacts'.

"Name der untergeordneten Beziehung" bestätigt, dass "Contact" ein untergeordnetes Objekt von "Account" ist. Er liefert uns auch den Beziehungsnamen, den wir für eine Abfrage der Über-/Unterordnungsbeziehung benötigen (die wir im weiteren Verlauf dieser Einheit behandeln).

Erstellen einer Abfrage einer Unter-/Überordnungsbeziehung

Jetzt wissen wir, dass "Contact" und "Account" in einer Unter-/Überordnungsbeziehung zueinander stehen. "Contact" ist das untergeordnete, "Account" das übergeordnete Objekt. Um alle (untergeordneten) Kontakte und den Namen des (übergeordneten) Accounts eines jeden Kontakts zurückzugeben, benötigen wir eine Abfrage der Unter-/Überordnungsbeziehung.

Bei einer Abfrage der Unter-/Überordnungsbeziehung fragen Sie das untergeordnete Objekt ab und erhalten Felder eines übergeordneten Objekts, indem Sie die Punktnotation wie folgt nutzen:

SELECT Name, Account.Name FROM Contact

Diese SELECT-Anweisung fragt das Objekt "Contact" ab. In der SELECT-Klausel ist Name das Feld "Name" des Kontakts und Account.Name das Feld "Name" des Accounts, der mit dem Kontakt verknüpft ist.

Ausführen der Abfrage einer Unter-/Überordnungsbeziehung

  1. Geben Sie in der Developer Console im Query Editor Folgendes ein:
    SELECT Name, Account.Name FROM Contact
  2. Klicken Sie auf Execute (Ausführen).

Die ersten sechs Zeilen Ihrer Ergebnisse sollten wie folgt lauten:

Abfrageergebnis – Zeilen insgesamt: 20
Name
Account.Name

Rose Gonzales
Edge Communications
Sean Forbes
Edge Communications
Jack Rogers
Burlington Textiles Corp of America
Pat Stumuller
Pyramid Construction Inc.
Andy Young
Dickenson plc
Tim Barr
Grand Hotels & Resorts Ltd

Die zweite Spalte enthält den Accountnamen aus dem übergeordneten Objekt "Account" des Kontakts.

Erstellen einer Abfrage einer Über-/Unterordnungsbeziehung

Nun wollen wir uns ansehen, wie ein übergeordnetes Objekt abgefragt werden kann, um Felder aus seinem untergeordneten Objekt abzurufen. Bei einer Abfrage der Über-/Unterordnungsbeziehung rufen wir mithilfe einer Unterabfrage Felder aus dem untergeordneten Objekt ab. Eine Unterabfrage ist eine in Klammern eingeschlossene SELECT-Anweisung, die in einer anderen Abfrage geschachtelt ist.

Angenommen, unsere Anforderung lautet wie folgt:

"Für jeden Account den Accountnamen und den Namen jedes zugehörigen Kontakts zurückgeben."

Wenn wir "jeden zugehörigen" lesen, wissen wir, dass wir eine Beziehungsabfrage benötigen. Da "Contact" ein untergeordnetes Objekt von Account ist, benötigen wir eine Abfrage der Über-/Unterordnungsbeziehung, die eine Unterabfrage des untergeordneten Objekts enthält.

Hauptabfrage (für jeden Account den Accountnamen zurückgeben) und Unterabfrage (den Namen jedes zugehörigen Kontakts).

Der erste Teil der Anforderung, "Den Account für Accountnamen zurückgeben", wird zur Hauptabfrage, die den äußeren Teil der vollständigen Abfrage bildet. Der zweite Teil der Anforderung, "den Namen jedes zugehörigen Kontakts" wird zur Unterabfrage, der inneren Abfrage, die in der Hauptabfrage geschachtelt ist.

Zunächst definieren wir die Hauptabfrage: SELECT Name FROM Account

Als Nächstes definieren wir die Unterabfrage in Klammern: (SELECT Name FROM Contact)

Dann positionieren wir die Unterabfrage so, als wäre sie das zweite Feld in der Hauptabfrage. Wir fügen ein Komma hinter Name und dann die Unterabfrage wie folgt ein:

SELECT Name, (SELECT Name FROM Contact) FROM Account Unterabfrage: SELECT Name FROM Contact

Innerhalb einer Unterabfrage verwenden wir anstelle des Feldnamens des verwandten Objekts den Namen der untergeordneten Beziehung. Im letzten Schritt ändern wir die Unterabfrage so, dass sie den Namen der untergeordneten Beziehung Contacts anstelle des Objektnamens Contact verwendet, etwa so:

SELECT Name, (SELECT Name FROM Contacts) FROM Account Unterabfrage: SELECT Name FROM Contacts

Diese Abfrage gibt den Accountnamen und alle Kontaktnamen für alle Accounts zurück. Sehen wir uns das im Einzelnen an.

Diese Abfrage besteht aus drei Teilen:

  1. Die Abfrage wählt einen Account aus und ruft das Feld "Accountname" ab. Dies ist die Hauptabfrage (die äußere Abfrage).
  2. Als Nächstes prüft die Abfrage die mit dem Account verknüpften Kontakte und ruft für jeden das Feld "Name" ab. Dies ist die Unterabfrage (die innere Abfrage).
  3. Dann wird der nächste Account ausgewählt und der Vorgang wiederholt, bis alle Accounts ausgewählt wurden.

Ausführen der Abfrage einer Über-/Unterordnungsbeziehung

  1. Geben Sie im Query Editor Folgendes ein:
    SELECT Name, (SELECT Name FROM Contacts) FROM Account
  2. Klicken Sie auf Execute (Ausführen).

Die ersten sechs Zeilen Ihrer Ergebnisse sollten wie folgt lauten:

Abfrageergebnis – Zeilen insgesamt: 12
Name
Kontakte
Edge Communications
[{"Name":"Rose Gonzalez"},{"Name":"Sean Forbes"}]
Burlington Textiles Corp of America
[{"Name":"Jack Rogers"}]
Pyramid Construction Inc.
[{"Name":"Pat Stumuller"}]
Dickenson plc
[{"Name":"Andy Young"}]
Grand Hotels & Resorts Ltd
[{"Name":"John Bond"},{"Name":"Tim Barr"}]
United Oil & Gas Corp.
[{"Name":"Arthur Song"},{"Name":"Avi Green"},{"Name":"Lauren Boyle"},{"Name":"Stella Pavlova"}]

Sehr interessant! Im Fenster mit den Ergebnissen der Abfrage werden die Accountnamen und eine Sammlung untergeordneter Kontaktdatensätze angezeigt, die mit jedem Account verknüpft sind. Diese Art der Sammlung kommt Ihnen wahrscheinlich bekannt vor, da wir Zuordnungen im Modul Objektorientierte Programmierung für Administratoren behandelt haben.

Falls Sie nicht mehr wissen, was eine Zuordnung ist, keine Sorge, wir gehen das Ganze noch einmal durch. Eine Sammlung von Zuordnungen enthält durch Komma getrennte Schlüssel-Werte-Paare. Der Schlüssel ist der Feldname, z. B. "Name". Auf den Schlüssel folgt sein Wert, z. B. Jake Llorrac. Die Schlüssel-Wert-Paare werden von der geschachtelten SELECT-Anweisung zurückgegeben, die die mit dem Account verknüpften Kontakte abfragt.

Filtern mithilfe einer Unterabfrage

Angenommen, wir suchen nur Accounts, die einen zugehörigen Kontakt mit dem Nachnamen "Forbes" haben. Das ist knifflig, denn wir möchten das übergeordnete Objekt, Account, nach einem Wert im untergeordneten Objekt, Contact, filtern. So wie wir eine Unterabfrage in der Hauptabfrage geschachtelt haben, können wir eine Unterabfrage (des untergeordneten Objekts) in der WHERE-Klausel der Hauptabfrage verwenden. Die Ergebnisse der Unterabfrage fungieren wie ein Filter für die Hauptabfrage. Wenn Sie mit Kreuzfiltern vertraut sind, entspricht das Hinzufügen der WHERE-Klausel in der Unterabfrage der Verwendung eines Kreuzfilters in einem Bericht.

Wir beginnen mit unserer bestehenden Abfrage:
SELECT Name, (SELECT Name FROM Contacts) FROM Account

Als Nächstes benötigen wir eine Unterabfrage, die das Feld "AccountId" von Kontakten mit dem Nachnamen "Forbes" abruft:

(SELECT AccountId FROM Contact WHERE LastName = 'Forbes')

Sie werden sich fragen, warum wir das Feld "AccountId" des Kontakts benötigen. Wir prüfen das Feld "AccountId" des Kontakts auf Kontakte, die mit einem Account verknüpft sind. Ein Kontakt ist mit einem Account verknüpft, wenn das Feld "AccountId" im Objekt "Contact" und das Feld "Id" im Objekt "Account" denselben Wert haben (Contact.AccountId = Account.Id). Daher fragen wir das Objekt "Contact" ab und geben dessen Wert für "AccountId" zurück. Um den Account auszuwählen, der mit dem Kontakt verknüpft ist, suchen wir den Account, der diesen Wert in seinem Feld "Id" aufweist.

Schließlich fügen wir der Hauptabfrage eine WHERE-Klausel hinzu. Wir möchten einen Accountdatensatz nur auswählen, wenn seine ID im Feld "AccountId" eines von der Unterabfrage zurückgegebenen Kontakts enthalten ist. Deshalb fügen wir WHERE Id IN hinzu, gefolgt von der Unterabfrage, etwa so:

SELECT Name, (SELECT Name FROM Contacts) FROM Account WHERE Id IN (SELECT AccountId FROM Contact WHERE LastName = 'Forbes')

Diese Abfrage dient also vier Zwecken.

  1. Die Abfrage findet Kontakte mit dem Nachnamen "Forbes" und gibt den Wert des Felds "AccountId" aller Kontakte zurück. (Dies übernimmt die Unterabfrage in der WHERE-Klausel.)
  2. Als Nächstes findet sie den Wert dieser "AccountId" im Feld "Id" eines Accounts und ruft den Namen dieses Accounts ab. (Dies übernimmt die WHERE-Klausel.)
  3. Dann prüft die Abfrage die mit dem Account verknüpften Kontakte und ruft den Namen jedes Kontakts ab. (Dies übernimmt die Unterabfrage der Hauptabfrage.)
  4. Schließlich gibt die Hauptabfrage den Namen jedes Accounts zurück, der einen zugehörigen Kontakt mit dem Nachnamen "Forbes" hat, und für jeden dieser Accounts die Namen aller zugehörigen Kontakte.

Ausführen der gefilterten Abfrage

  1. Geben Sie im Query Editor Folgendes ein:
    SELECT Name, (SELECT Name FROM Contacts)
    FROM Account
    WHERE Id IN (SELECT AccountId FROM Contact WHERE LastName = 'Forbes')
  2. Klicken Sie auf Execute (Ausführen).

Ihre Ergebnisse sollten wie folgt aussehen:

Abfrageergebnisse: Spalte 1: Namen, Spalte 2: Durch Komma getrennte Liste der Vor- und Nachnamen des Kontakts.

Übersicht

Jetzt wissen Sie, wie Sie den richtigen Typ von Beziehungsabfrage für Standardobjekte auswählen und erstellen können. In der nächsten Einheit erfahren Sie mehr zu Beziehungsabfragen für benutzerdefinierte Objekte.

Ressourcen

Teilen Sie Ihr Trailhead-Feedback über die Salesforce-Hilfe.

Wir würden uns sehr freuen, von Ihren Erfahrungen mit Trailhead zu hören: Sie können jetzt jederzeit über die Salesforce-Hilfe auf das neue Feedback-Formular zugreifen.

Weitere Infos Weiter zu "Feedback teilen"