salesforceでマージ後、どのレコードにマージされたのかをSOQLで確認する方法

Salesforceでは、重複するリード(Lead)や取引先責任者(Contact)を同士をマージ(Merge)して一つのレコードにすることができます。
※取引先責任者の場合は同じ取引先属している取引先責任者同士でしかマージできない。

マージするには、複数のレコードを選択して、以下のような画面で、マスタとなるレコード(メインになるレコードで、基本的にはこのレコードに寄せることで複数のレコードを一つにするが、それぞれの項目ごとにどのレコードの値を活かすかは指定可能)を決めます。

上記でマスタレコードとしたレコードが残るのですが、マージされたレコードはどうなるかというと、IsDeletedフラグがtrueになって、ゴミ箱に行きます。そして、基本的には15日程度経った後に、完全に物理削除されることになるわけです。

で、このゴミ箱に入ったデータをSOQL等で覗いてみると面白いことが分かります。「MasterRecordId」という項目に、統合されて残ったマスタのレコードのSalesforceIdが入っているのです。

つまり、この項目を確認すれば、「マージされたレコードが、どのレコード(マージ先)にマージされたのか」が分かるというわけです。

そのため、マージされてゴミ箱に行ったデータを確認するときには、

SELECT Id FROM Contact WHERE isDeleted=true and masterRecordId != null
   AND SystemModstamp > 2006-01-01T23:01:01+01:00

↑ ↑ ↑ 参考(merge())

といったSOQLで見つけることができます。(ただし、開発者コンソールとかからでは確認できず、Apex等を使う必要があるので、簡単に確認する方法については、この記事「salesforceのSOQLで、削除済み、マージ済みのレコードを取得する」を参考にしてください。)

実際に確認してみる

マージ前とマージ後の2レコードを比較してみた図

上記のように、マージ後のデータには「MaterRecordId」にオブジェクトIdが入っていることが分かります。

ただし、少し覚えておきたいのは、ゴミ箱から復元すると、この項目の値は「空」になってしまいますが、マージ先のデータは元に戻るわけではないため、「どのレコードにマージされたか」が分からなくなってしまうことです。