SOQLで孫を取得する方法

By | August 24, 2020
https://twitter.com/Regardie_/status/1297447569425985537?s=20

概要

上記ツイートの通り、child-to-parentのrelationship queryで五階層上までの情報を取得することが可能であるのに対して、parent-to-childのrelationship queryでは一階層下までの情報しか取得することができません。

この記事では、「商談」を手掛かりに「品目名スケジュール」を取得するというユースケースを手掛かりに、親の情報を基に子を辿っていく方法について解説します。

Bad Example(親から順に回す)

List<Opportunity> oppList =[SELECT id FROM opportunity];
 for(Opportunity opp: oppList){
  List<OpportunityLineItem> oliList = [SELECT id FROM OpportunityLineItem];
  for(OpportunityLineItem oli: oliList){
    List<OpportunityLineItemSchedule> olisList=[SELECT id FROM portunityLineItemSchedule];
    ~
}
}

「Too many SOQL queries: 101」エラー(´・ω・`)

Good Example1(子から親を取る形で書く)

SELECT opportunitylineitem.opportunity.id,opportunitylineitem.id,id FROM OpportunityLineItemSchedule;

逆転の発想。

WHERE句もopportunitylineitem.opportunity.~などを利用すればどの階層でも絞れちゃうので、これでOK✌

Fairly good example

SELECT id, Opportunity.id,( SELECT id from OpportunityLineItemSchedules) from OpportunityLineItem

二層目から親と子を両方取りにいくパターン。

WHERE句の兼ね合い次第ではこれでもOK