Mark Hammer's Blog

SalesforceやTrailheadに関する情報を投稿しているブログです。

データローダで複数のオブジェクトにまたがったデータを取得したい

はじめに

データローダでデータを取得しようとするとき、例えば取引先責任者で「ID、姓、名、取引先名、作成者、最終更新者」のデータを取得しようとすると、以下SOQLと結果になります。

  • SOQL
Select Id, AccountId, LastName, FirstName, CreatedById, LastModifiedById FROM Contact
  • 結果(CSV)
ID ACCOUNTID LASTNAME FIRSTNAME CREATEDBYID LASTMODIFIEDBYID
0032v00002m22azAAA 0012v00002MaYXxAAN Gonzalez Rose 0052v00000YW5o3AAD 0052v00000YW5o3AAD
0032v00002m22b0AAA 0012v00002MaYXxAAN Forbes Sean 0052v00000YW5o3AAD 0052v00000YW5o3AAD
0032v00002m22b1AAA 0012v00002MaYXyAAN Rogers Jack 0052v00000YW5o3AAD 0052v00000YW5o3AAD

ここで、取引先名、作成者、最終更新者はIDではなくて実際の名前を取りたいと思いました。
レポートであれば実際の名前を取得できるのですが、ここではデータローダで取得してみましょう。

データローダでリレーションクエリを使う

リレーションクエリとは、参照関係や主従関係がある場合に対象のオブジェクトと関連するオブジェクトのデータを取得するクエリです。
詳細は以下を参照してください。 developer.salesforce.com

リレーションクエリでは、 <呼び出し元の項目名>.<呼び出し先のAPI参照名> という形で項目を指定します。
「項目名」はAPI参照名ではなく、項目設定画面で確認できます。
例えば取引先責任者オブジェクトの「取引先名」項目は、API参照名は AccountId ですが、項目名は Account になります。

f:id:mark-hammer:20210706012109p:plain
リレーションクエリで用いる項目名

「はじめに」に書いた要件を満たすようリレーションクエリを用いたSOQLが以下になります。

Select Id, Account.Name, LastName, FirstName, CreatedBy.Name, LastModifiedBy.Name FROM Contact

結果(CSV)はこうなります。

ID ACCOUNT.NAME LASTNAME FIRSTNAME CREATEDBY.NAME LASTMODIFIEDBY.NAME
0032v00002m22azAAA Edge Communications Gonzalez Rose 管理 一郎 管理 一郎
0032v00002m22b0AAA Edge Communications Forbes Sean 管理 一郎 管理 一郎
0032v00002m22b1AAA GenePoint Rogers Jack 管理 一郎 管理 一郎

おわりに

標準オブジェクトやカスタムオブジェクトの場合、レポートでも同様の出力は得られますが、「サイト」や「権限セット」など、設定側のオブジェクトデータをエクスポートする際には役立つかと思います。
リレーションクエリはApex等開発でしか使わないものかと思っていましたが、データローダのエクスポートクエリはSOQLなので、リレーションクエリも使えるのだと勉強になりました。