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