【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.