【Salesforce】SOQLで子レコードを持つ親レコードを取得する

【Salesforce】SOQLで子レコードを持つ親レコードを取得する

SalesforceのSOQLにて、子レコードを持つ親のみを取得したい場合があるかと思います。

SQLと同じように、サブクエリを使うことで1回のSOQLで取得できるようです。

List<Account> accountList;

accountList = [select
                   Id
                   Name
               from
                   Account
               where
                   Id IN (select
                              AccountId
                          from
                              Contact)]; 

サブクエリで取得した取引先責任者の、親取引先のIDをWhere句で指定しているわけですね。

取得するフィールドに子レコードを含めると、取得したレコード数は親の数+子の数ということは以前ここで書いたことがあります。

http://www.subnetwork.jp/blog/?p=93

では、Where句にサブクエリが存在する場合はどうでしょうか。

ちょっと確認してみました。

まずは、普通にIDを指定した場合です。

// 親取引先を作成する
Account acc = new Account();
acc.Name = 'parent';
insert acc;

// 子取引先責任者を作成する
Contact con = new Contact();
con.AccountId = acc.Id;
con.LastName = 'child';
insert con;

// 親取引先を取得する
List<Account> accList = [select
                             Id
                         from
                            Account
                         where
                            Id = :acc.Id];

もちろん、SOQLも件数も1件です。

Number of SOQL queries: 1 out of 100
Number of query rows: 1 out of 50000

次に、フィールドに子レコードを含めた場合です。

// 親取引先を作成する
Account acc = new Account();
acc.Name = 'parent';
insert acc;

// 子取引先責任者を作成する
Contact con = new Contact();
con.AccountId = acc.Id;
con.LastName = 'child';
insert con;

// 親取引先を取得する
List<Account> accList = [select
                             Id,
                             (select
                                  Id
                              from
                                  Contacts)
                         from
                            Account
                         where
                            Id = :acc.Id];

以前の記事と同じように、親の件数と子の件数を合わせた数になりました。

Number of SOQL queries: 1 out of 100
Number of query rows: 2 out of 50000

今回のメインである、サブクエリの場合はどうでしょうか。

取得する取引先を同じにしています。

// 親取引先を作成する
Account acc = new Account();
acc.Name = 'parent';
insert acc;

// 子取引先責任者を作成する
Contact con = new Contact();
con.AccountId = acc.Id;
con.LastName = 'child';
insert con;

// 親取引先を取得する
List<Account> accList = [select
                             Id
                         from
                            Account
                         where
                            Id = :acc.Id
                         and
                            Id IN (select
                                       AccountId
                                   from
                                       Contact)];

意外にも、取得件数に含まれませんでした。

Number of SOQL queries: 1 out of 100
Number of query rows: 1 out of 50000

SOQLの取得レコード数は、参照可能なレコードの数ということでしょうか。

サブクエリが取得件数に含まれないのであれば、とても便利ですね。

No comments.

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です