DataLoaderで複雑なSOQLも実行出来るって知ってました？ 

# 初めに
SFDC技術者の皆さん。こんにちは。
DataLoaderで複雑なSOQLも実行出来るって知ってました？

「知ってるよー。そんなの当たり前！」という方、さすがです。
知らなかった方は是非、この記事を読んでみて下さい。今まで苦労していたデータのメンテナンス作業が各段に楽になります。

【この記事はこんな方にお勧め】
・SFDCの本番環境のデータのメンテナンスに苦労している
・データが増えていてSFDCのガバナ制限に困っている
・DataLoaderの使い方が知りたい

**※間が長いので、複雑なSOQLの実行方法のみ知りたい方は記事の最後だけ見て下さい。**

# SalesforceのDataLoaderとは
本題に入る前に、まずはDataLoaderについて解説します。
SalesforceのDataLoaderは、Salesforceプラットフォームでのデータのエクスポートおよび登録、更新、削除を行うための公式ユーティリティツールです。Salesforceでデータをメンテナンスするには、DataLoaderかインポートウィザード、開発者コンソールを使います。その中で、DataLoaderは大量データを扱えるツールで、本番でデータをメンテナンスする場合は、大抵はこのDataLoaderを使います。

### DataLoaderのインストール方法
DataLoaderのインストール方法は[公式サイト](https://help.salesforce.com/s/articleView?id=000383107&type=1)を参照下さい。
インストールするとこの様なツールが立ち上がります。
![SalesforceのDataLoader](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3540922/de939513-9ee4-65c7-6f65-0124127ca908.jpeg)

### DataLoaderで出来ること
DataLoaderで出来ることは下表のことになります。
|操作  |説明  |
|---|---|
|Insert  |データを登録する  |
|Update  |データを更新する（IDをキーにデータを更新する）  |
|Upsert  |データを登録・更新する（同一IDがあればUpdate、なければInsertする）  |
|Delete  |データを削除する（IDをキーにデータを削除する。）  |
|Export  |データを抽出する（ごみ箱のデータは検索できない）  |
|Export ALL  |データを抽出する（ごみ箱のデータは検索できる）  |

詳しくは[公式サイト](https://help.salesforce.com/s/articleView?id=sf.data_loader.htm&type=5
)を参照下さい。

# DataLoaderの基本的な使い方
Salesforceでデータをメンテナンスする場合はIDをキーにデータの更新や削除を行います。
なので、DataLoaderのExport機能でIDを含めたメンテナンス対象データを取得し、それをExcelやテキストエディタなどで編集し、DataLoaderのUpdate機能でデータを更新するといった使い方が一般的です。

### DataLoaderでデータをExportする
DataLoaderでデータをExportする具体的な手順を、商談(Oppotunity)オブジェクトの全項目をExportする場合を例に以下に記します。

【DataLoaderのExport手順】
①「Export」ボタンを押す
②ユーザID、パスワードを入力し「Login」ボタンを押す
➂Export対象のオブジェクトを選択する（ex.Oppotunity）
④Export先のファイルパスを入力する（ex.D:\tmp\Oppotunity.csv）
⑤「Next」ボタンを押す
⑥「Select all fields」ボタンを押す（注. 取得項目を絞る場合は取得したい項目のみチェックを付ける）
⑦「Finish」ボタンを押す
⑧確認ダイアログで「はい」ボタンを押す
⑨処理完了ダイアログ(Operation Finished)にエラーが無いことを確認し「ＯＫ」ボタンを押す

【DataLoaderのExportの操作イメージ】
![DataLoaderのエクスポート](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3540922/97bbfe1d-c820-65c2-9851-0fa8451a7cd8.png)


### DataLoaderでデータをUploadする
DataLoaderでデータをUploadする具体的な手順を、商談(Oppotunity)オブジェクトを例に以下に記します。

【DataLoaderのUpload手順】
①DataLoaderに読み込むCSVデータを編集する（ex.前述のExport手順で取得したOppotunity.csvで更新したい項目の値を編集する）
②「Update」ボタンを押す
➂ユーザID、パスワードを入力し「Login」ボタンを押す
④Update対象のオブジェクトを選択する（ex.Oppotunity）
⑤Update用CSVファイルパスを入力する（ex.D:\tmp\Oppotunity.csv）
⑥「Next」ボタンを押す
⑦確認ダイアログで「OK」ボタンを押す
⑧「Create or Edit Map」ボタンを押す
⑨「Auto-Match Field to Columns」ボタンを押す（注. 更新項目を絞る場合は更新したい項目のみマッピングする）
⑩「OK」ボタンを押す
⑪「Next」ボタンを押す
⑫ログの出力フォルダのパスを入力する（ex.D:\tmp\log）
⑬「Finish」ボタンを押す
⑭確認ダイアログで「はい」ボタンを押す
⑮処理完了ダイアログ(Operation Finished)にエラーが無いことを確認し「ＯＫ」ボタンを押す

【DataLoaderのUpdateの操作イメージ】
![DataLoaderのUpdate](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3540922/fa144885-065e-3f85-5f1e-157265d480f5.png)

# DataLoaderで複雑なSOQLを実行する
ようやく本題です。

前述の手順ではデータをExportする際の項目を「Select all fields」ボタンで設定しました。
実は、取得対象の項目はSOQLを直書き出来ます。
![DataLoaderのExportのSOQLの直書き](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3540922/ecc38ba0-02c6-4d2d-d46f-2795e83bfc11.png)

「なんだ知っているよ」という方多いと思います。
でもですので、何と、ここにかけるSOQL、何でもOKです。

上記画面の「Choose the query fields below」に対象オブジェクトの項目しか出ていないので、対象オブジェクトの項目しか書けないと思っている方が結構多いです。
**実はDataLoaderのExportに記載するSOQLは参照関係をたどって親の項目も取得出来ますし、where句に複雑な条件も書けます。サブクエリも使えます。**

例えば以下は商談オブジェクトから、取引先責任者の所有者のユーザ名にtestを含むレコードの
商談のID、商談の名前、取引先責任者の名前を取得するSOQLです。
<code>SELECT Id, Name, Account.Name FROM Opportunity where Account.Owner.Username like '%test%'</code>
対象オブジェクト以外の項目も取得項目にしていますが、これでもDataLoaderでデータのExportが出来ます。

これ、何が嬉しいかと言いますと、対象のオブジェクトの項目しか取得出来ないとすると、例えば、商談オブジェクトの商談名(Name)に、取引先責任者の名前をセットしたいとします。この場合に、商談オブジェクト(Opportunity)と取引先責任者オブジェクト(Account)のレコードをそれぞれ取得し、ExcelでVlookupなどを使って更新用のCSVファイルを作成する形になります。本番データが100万件とかあったら、まず無理です。
ですが、結構多くの方が単一オブジェクトのデータを取得しExcelを駆使して更新データを作成しています。

でもですので、SOQLを組めれば上記要件は一発クリアです。前述のSOQLを取得して商談のIDと取引先責任者の名前のペアのCSVをExportして、それをDataLoaderでUpdateするだけです。
これ知っているExcelでデータをガリガリ作っているのを見ると狂気！！と思います。

あと、開発者コンソールなどからSOQLを発行すると5万件でガバナ制限エラーになります。
でもDataLoaderで同じSOQLを実行するとガバナ制限エラーになりません。全件データが取れます。
SOQL使ってデータ調査したいけど開発者コンソールで実行するとガバナ再現エラーになるんだよなという時に、開発者コンソールで実行出来るSOQLは実はDataLoaderでも実行出来ると知っておくとガバナ制限に悩まずに済みます。

# 本日のまとめ
1.DataLoaderのExportは基本的にはどんなSOQLも実行出来る
2.DataLoaderのExport時の「The generated query will appear bellow. You may edit it before finisheing.」という欄にSOQLが書ける
3.Export対象オブジェクト以外の項目も取得出来る
4.複数のオブジェクトを参照して更新データを作る場合などに、Excelなどを駆使せずSOQLで解決出来ないか考えてみると以外と簡単にデータ作れたりする
5.DataLoaderのExportは5万件のガバナ制限にかからないので開発者コンソールでガバナ制限で実行出来ないSOQLを流したい時にDataLoaderを使うという選択肢もある

以上です。この記事が誰かのお役に立てたら幸いです。