【Salesforce】SOQLで子レコードを持つ親レコードを取得する
SalesforceのSOQLにて、子レコードを持つ親のみを取得したい場合があるかと思います。
SQLと同じように、サブクエリを使うことで1回のSOQLで取得できるようです。
1 2 3 4 5 6 7 8 9 10 11 12 | 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を指定した場合です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | // 親取引先を作成する 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件です。
1 2 | Number of SOQL queries: 1 out of 100 Number of query rows: 1 out of 50000 |
次に、フィールドに子レコードを含めた場合です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | // 親取引先を作成する 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]; |
以前の記事と同じように、親の件数と子の件数を合わせた数になりました。
1 2 | Number of SOQL queries: 1 out of 100 Number of query rows: 2 out of 50000 |
今回のメインである、サブクエリの場合はどうでしょうか。
取得する取引先を同じにしています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | // 親取引先を作成する 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)]; |
意外にも、取得件数に含まれませんでした。
1 2 | Number of SOQL queries: 1 out of 100 Number of query rows: 1 out of 50000 |
SOQLの取得レコード数は、参照可能なレコードの数ということでしょうか。
サブクエリが取得件数に含まれないのであれば、とても便利ですね。
No comments.