2021/06/28

SalesforceのSOQLサブクエリを活用して、複雑なクエリを作成する方法

 
  

SalesforceのSOQLによるリレーションクエリとサブクエリ

SalesforceのSOQLのリレーションクエリとサブクエリを利用して、オブジェクト間の親-子のリレーションまたは子-親のリレーションを横断して、結果を絞りこむことができます。 リレーションクエリは、標準オブジェクトとカスタムオブジェクトでクエリを実行すると呼ばれる構文です。一度に複数のオブジェクト種別へのクエリを実行できます。 例えば、リレーションクエリでは、ある種別のオブジェクトから、別の種別のオブジェクトに適用される条件による絞りこみができます。この場合の“別の種別のオブジェクトに適用される条件”がサブクエリになります。

SalesforceのSOQLのサブクエリに比較演算子を含める

SalesforceのSOQL クエリのSELECT ステートメントでは、WHERE 句の項目式に比較演算子を含むことができます。これにより、準結合と反結合のクエリを作成できます。

SOQLのサブクエリに使用できる比較演算子の例

SalesforceのSOQLのサブクエリで使用できる、比較演算子を紹介します。 比較演算子は、条件に合致する場合に決められた式を返します。文字列を比較する場合、大文字と小文字が区別される一意の項目だけで、大文字と小文字が区別されます。それ以外の項目では、大文字と小文字は区別されません。 ・=(Equals) 条件:fieldName の値が式の value に一致する。 式:true ・!=(Not equals) 条件:f ieldName の値が指定した value に一致しない 式:true ・<(Less than) 条件:fieldName の値が指定した value より小さい。 式:true ・>(Greater than) 条件:fieldName の値が指定した value より大きい。 式:true ・IN(IN) 条件:値が WHERE 句の値のいずれかに等しい。 式:true ・LIKE(Like) 式:true 条件:fieldName の値が指定した value のテキスト文字列の文字に一致する。 式:true

SalesforceのSOQLサブクエリの活用例 準結合と反結合

SalesforceのSOQLでは、サブクエリのINやNOT IN 句内の値リストを置き換えることにより、主キーであるID項目、もしくは外部キーである参照項目による絞り込みを行えます。これらは準結合、反結合と呼ばれ、返されるレコードを制限します。 準結合:IN 句の別のオブジェクトのサブクエリ 反結合:NOT IN 句の別のオブジェクトのサブクエリ ここでは、SOQLクエリのIN を使用して、準結合と反結合の活用例を紹介します。INでは、値のセットを、同じオブジェクトの別の項目で指定されている項目の値を参照できます。サンプルを紹介します。
SELECT Name FROM Account
WHERE BillingState IN ('Sample1', ' Sample2') 

SalesforceのSOQLサブクエリの活用例① ID 項目による絞りこみ

SOQLサブクエリでのID項目による絞り込みでは、親-子の準結合もしくは反結合を作成できます。ここでは、Account(親)とOpportunity (子)を例に挙げて説明します。

SOQLサブクエリのID 項目の準結合

SOQLサブクエリのID 項目による準結合の活用例を紹介します。WHERE 句に準結合を含みます。 このサンプルは、関連づけられている商談(Opportunity)が不成立となっている取引先 ID を返します。サブクエリは、比較対象の項目と同じ種別の項目を返します。IN 句の左にあるオペランド IdがID 項目をさしています。
SELECT Id, Name
FROM Account
WHERE Id IN
  ( SELECT AccountId
    FROM Opportunity
    WHERE StageName = 'Closed Lost' 

SOQLサブクエリのID 項目の反結合

SOQLサブクエリのID 項目による反結合の活用例として、進行中の商談がないすべての取引先の取引先 ID を返す、反結合のサンプルを紹介します。
SELECT Id
FROM Account
WHERE Id NOT IN
  (
    SELECT AccountId
    FROM Opportunity
    WHERE IsClosed = false
  ) 

SalesforceのSOQLサブクエリの活用例② 参照項目による絞りこみ

参照項目による絞りこみでは、子-子および子-親のリレーションに対して、それぞれ準結合と反結合を作れます。 下の例のように、Contact(子)もしくはOpportunity(子)とAccount(親)だけでなく、Contact(子)とOpportunity(子)のような子と子の間でも作成できます。 ・子-子の準結合もしくは反結合 例)Contact と Opportunity ・子-親の準結合もしくは反結合 例)Opportunity と Account

SOQLサブクエリの参照項目の準結合

SOQLサブクエリの参照項目による準結合の活用例として、Sample1に該当する取引先責任者の ToDo ID を返す、サンプルを紹介します。 IN 句の左にあるオペランド WhoId が参照項目をさします。WhoId により、取引先責任者もしくはリードを参照できるため多態的な参照項目になりますが、参照結果はサブクエリによって取引先責任者に制限されます。
SELECT Id
FROM Task
WHERE WhoId IN
  (
    SELECT Id
    FROM Contact
    WHERE MailingCity = 'Sample1'
  ) 

SOQLサブクエリの参照項目の反結合

SOQLサブクエリの参照項目による反結合の例として、Opportunity(子)とContact(子)の反結合のサンプルを消化します。 このサンプルでは、供給元が Webを除く取引先責任者の商談 ID すべてを返します。
SELECT Id
FROM Opportunity
WHERE AccountId NOT IN
  (
    SELECT AccountId
    FROM Contact
    WHERE LeadSource = 'Web'
  ) 

SalesforceのSOQLサブクエリを活用しよう

今回は、SalesforceのSOQLのサブクエリについて説明しました。 SOQLのサブクエリを使用して、Salesforceのオブジェクトを横断してクエリすることができます。 ここで紹介したのはごく一部の例です。SOQLのサブクエリを活用しましょう。]]>