salesforceのSOQLで、削除済み、マージ済みのレコードを取得する

salesforceでレコードを削除したり、マージしたりすると、削除されたレコード、マージされて無くなったレコードはゴミ箱に入ります。

通常、SOQLではゴミ箱に入っているレコードは検索対象にならないのですが、以下のようにALL ROWS句を使うと、ゴミ箱も含むすべてのレコードも検索対象となります。なお、ゴミ箱内のレコードを指定するWhere条件には、「IsDeleted = true」を使用します。

System.assertEquals(2, [SELECT COUNT() FROM Contact WHERE AccountId = a.Id ALL ROWS]);

↑ ↑ ↑ 参考(Querying All Records with a SOQL Statement)

なお、ALL ROWSを使ったSOQLはAPEXコード内か、SOAP APIなどのqueryAll()メソッド内で有効で、開発者コンソールから直接SOQLを投げるとエラーになってしまいます。

画面からSOQLを指定して簡単に確認するには

そのため、開発者コンソールからSOQLをたたいて簡単に確認したいなーというときには試せません。

そんなときには以前紹介した、Salesforce Workbenchを使うとクエリの結果に「ゴミ箱のデータを含む/含まない」の指定が画面からできて、便利です。

Workbenchにログインして、画面上部のメニューから「queries」→「SOQL Query」と進むと上記ののような画面になります。

この画面の中央部のテキストエリアにSOQLを入力して「Query」ボタンを押せば結果が表示されるのですが、その結果にゴミ箱およびアーカイブされたデータ(IsDeleted=true または IsArchived=true)のデータも含めるには、「Deleted and archived records:」で「Include」にチェックを入れておきます。