【アドミニストレーター必読!】Salesforce SOQLの極意

【アドミニストレーター必読!】Salesforce SOQLの極意

みなさん、こんにちは!
Salesforceエンジニアの森川です。
今回のテーマは、Salesforceの「SOQL」です。
SOQLの概要から、その重要性、そして設定方法まで、実践的な視点を交えて解説していきます。

SOQLとは?

1. SOQLの定義

SOQLとはSalesforce Object Query Languageの略称で、Salesforceに保存されたデータを検索・取得するための問い合わせ言語です。Lightning環境において、SQL(Structured Query Language)に似た簡潔な構文でオブジェクト(レコード)から必要な情報を効率的に抽出できます。

2. SOQLの主要なメリット

SQLライクな直感的構文

SELECTやWHEREといったSQLに似た構文を使用するため、直感的で習得しやすい点がメリットです。たとえば「SELECT フィールド名 FROM オブジェクト名 WHERE 条件」のように記述し、必要な情報だけを抽出できます。高度なプログラミング知識がなくても扱えるため、非エンジニアの管理者でも短時間で活用可能です。

柔軟なデータ抽出

レポートでは取得しにくいデータ抽出を簡単に実現できます。例えば複数オブジェクトにまたがる条件付き検索や、カスタムオブジェクトの特定項目だけを抽出したい場合など、SOQLならクエリ一つで柔軟に必要な情報を取得可能です。また、必要な項目だけを選択して取り出すため無駄なデータを省け、結果をCSVで出力するなど後続のデータ処理にも活用しやすい点も魅力です。

Lightning環境での容易な活用

Lightning環境では開発者コンソール(Developer Console)のクエリエディタから直接実行できるほか、Workbenchなど管理者向けツールからも利用可能です。Salesforceプラットフォームに組み込まれているためインストール不要で使え、結果は常に最新の情報が得られます。また、実行時にはユーザのアクセス権限が自動的に適用されるため、安全にデータ取得が行えます。

3. SOQLを扱う上での注意点

ガバナ制限を遵守する

1回のトランザクションで発行できるSOQLクエリは最大100件、取得できるレコード数も最大5万件といった上限が定められています​。ループ内でSOQLを実行するコードを書くと上限超過の可能性があるので注意しましょう。そのためSOQLは一括処理し、必要最小の実行回数に抑えましょう。

クエリ効率とデータ量の考慮

SOQLクエリはフィルタを駆使し、取得データを可能な限り絞り込みましょう。インデックス付き項目をWHERE条件に使うとクエリが高速化します​。SELECT句は必要な項目だけに絞り、不要なデータ取得を抑えます​。大量のレコード取得はタイムアウトなどの原因になるため、条件を設定して対象データを限定しましょう。

セキュリティとアクセス制御

ユーザ入力を動的SOQLに組み込むと不正なクエリが実行される恐れがあります​。動的SOQLではバインド変数やescapeSingleQuotesでエスケープしましょう。Apex内のSOQLはユーザ権限を考慮しません​。with sharingやWITH SECURITY_ENFORCEDで権限を反映させましょう。

3. SOQLのやり方

ここではSalesforce管理者初心者向けに、商談オブジェクト(Opportunity)を題材としてSOQLの基本から応用までを難易度順に説明します。実際の業務で使える具体例とともに、初級(基本的なSELECT)、中級(WHEREによる絞り込みやソート)、上級(関連オブジェクト参照、集計、サブクエリ)の3つのレベルに分けて解説します。

初級

まずはSOQLの基本形を確認しましょう。商談オブジェクトから主要な項目を取得するシンプルなクエリです。例えば、「商談名」「金額」「フェーズ(商談のステージ)」といった基本情報を一覧取得する場合、次のようなSOQLになります。

SOQL

解説
  • SELECT句
    Name, Amount, Type は取得したい項目のAPI名です。商談名(Name)、金額(Amount)、商談 種別(Type)を指定しています。
  • FROM句
    Opportunity は商談オブジェクトのAPI名です。ここで対象となるオブジェクト(テーブル)を指定します。

中級

次に、SOQLに条件指定やソートを加えて、必要なレコードだけを絞り込む方法を見ていきましょう。中級レベルでは、WHERE句によるフィルタリング、ORDER BY句による並び替え、LIMIT句による取得件数の制限といった拡張機能を使用します。例1: 金額が一定以上の商談を取得する
たとえば「金額が100万円以上の商談」だけに絞り込みたい場合、WHERE句で条件を指定できます。また、その結果を金額の高い順に並べ替え、さらに上位5件だけ取得することも可能です。SOQLはSQLに似た構文なので、これらを一つのクエリで実現できます。

SOQL

解説
  • WHERE句
    WHERE Amount >= 1000000 は絞り込み条件です。Amount(商談金額)が1,000,000以上のレコードだけを対象にします。これにより、小口の商談は除外され、大口(100万円以上)の商談だけを取得できます。例えば「特定の金額以上の商談を抽出したい」といった場合にこのような条件指定が役立ちます。​また、WHERE StageName = ‘Prospecting’ AND Amount < 500000 のようにANDやORで条件を組み合わせた複数条件も可能です。
  • ORDER BY句
    ORDER BY Amount DESC は結果の並び順を指定しています。Amount(金額)を基準に降順(DESC)でソートすることで、金額が大きい商談から順に結果が表示されます。例えば「売上規模の大きい商談トップ5を知りたい」といった場合に、この並び替えを指定すると便利です。
  • LIMIT句
    LIMIT 5 は取得するレコード数を最大5件に制限しています​。大量の結果が返ってくるのを避け、上位5件だけ見たい場合に使います。これにより、例えば「金額上位5件の商談」のようにトップNリストを簡単に得ることができます。

上級

最後に、より高度なSOQLのテクニックを解説します。上級レベルでは、関連オブジェクトを含むクエリや集計関数を使ったクエリ(GROUP BY句)、そしてサブクエリを活用した高度なデータ取得方法を紹介します。これらを使うことで、複数のオブジェクトにまたがる情報や集計結果を1度のクエリで取得することが可能です。

関連オブジェクトを含めたクエリ

Salesforceではオブジェクト間にリレーション(参照関係)が設定されています。商談(Opportunity)は取引先(Account)や商談所有者(ユーザ)などを参照しています。SOQLではドット記法を用いることで、関連するオブジェクトの項目も取得できます​。これにより、別オブジェクトにまたがる情報を一度に取得でき、管理者がデータを横断的に確認するのに役立ちます。例: 商談と関連する取引先の名前を一緒に取得するクエリは次の通りです。

SOQL

解説
  • 上記クエリでは、Account.Nameという形式で関連先である取引先オブジェクト(Account)の名前を取得しています。Account.Nameは、「商談に関連付けられた取引先レコードの名前」という意味になります。同様に、商談所有者(所有者はUserオブジェクト)についてOwner.Nameと指定すれば、その商談の所有ユーザ名を取得できます​。
  • 関連オブジェクトの参照は、レポートやリストビューでは一度に表示できない組み合わせの情報を取得したい場合に有用です。例えば「商談名・金額・フェーズと併せて、その商談の取引先名も一覧で確認したい」というとき、このSOQLを使えば一度のクエリで情報を引き出せます。
GROUP BYを使用した集計クエリ

SOQLでは集計関数(COUNTやSUMなど)とGROUP BY句を使って、レコードを集計することもできます。これにより、個々のレコードを取得する代わりに、まとめた情報(件数や合計値など)を得ることが可能です。レポート機能と似た集計をクエリだけで手軽に実行できるため、管理者が状況を把握するのに重宝します。

SOQL

解説
  • GROUP BY句
    GROUP BY StageName により、Type(商談 種別)ごとにレコードをグループ化しています。つまり同じステージの商談をひとまとめにし、その単位で集計を行います。
  • 集計関数
    COUNT(Name) は各グループ(各商談 種別)の商談件数を数えています。フィールド名にはIdやNameなどnullにならない項目を指定します(どちらでも件数は同じです)。このクエリの結果は「商談 種別ごとの商談数」の一覧になります。​
  • ORDER BY句と結果の並び
    ORDER BY COUNT(Name) DESC を付けているので、件数の多い順に並び替えて結果が表示されます。例えば「どのフェーズに案件が多く滞留しているか」を知りたい場合、件数の降順で確認すると一目瞭然です。
サブクエリを活用した高度なデータ取得

最後にサブクエリを使った高度なクエリの例です。サブクエリを使うと、親子関係にある関連レコードを入れ子状に取得したり、関連レコードの有無を条件に含めたりすることができます。これにより、一度のクエリで複数オブジェクトの関連データを同時に取得したり、関連データに基づくフィルタリングが可能になります。

1つ目の例は、子オブジェクトのデータを親オブジェクトのクエリ内で取得するパターンです(親→子のリレーションをたどるサブクエリ)。商談を親オブジェクト、その子レコードである商談商品(OpportunityLineItem)をサブクエリで取得してみます。例えば「商談 種別がNew Customerの商談」について、その商談に含まれる商品明細を同時に取得するクエリは以下のようになります。

SOQL

解説
  • SELECT Name, Type, (SELECT … FROM OpportunityLineItems) FROM Opportunity の部分で、商談(Opportunity)を親として、その直下の子レコードである商談商品(OpportunityLineItemオブジェクト)を取得しています。子リレーション名は通常オブジェクト名の複数形が使われており、Opportunityオブジェクトにおける商談商品のリレーション名はOpportunityLineItemsです。サブクエリ内では、取得したい子オブジェクトの項目(ここでは商品名や数量、単価など)をSELECTします。
  • このクエリを実行すると、「New Customer」それぞれについて、その商談に紐づく商品明細のリストが取得されます。結果のイメージとしては、各商談の行に子レコードとして複数の商品(名称、数量、単価)が含まれる形になります。例えば「A社との商談(成立)に含まれる製品Xが2個、製品Yが5個」といった情報まで一度に得ることができます。レポート機能で言えば主従レポートのような情報をSOQL一発で取得できるイメージです。
関連オブジェクトの有無でレコードを絞り込むサブクエリ

こちらは少し発展的な内容ですが、知っておくと便利なテクニックです。例えば「商談を一度も持たない取引先」のリストが欲しい場合、取引先を主対象としつつ商談に関する条件をサブクエリで指定することで抽出できます。

SOQL

解説
  • このクエリでは取引先(Account)のレコードを検索し、その条件としてWHERE Id NOT IN (SELECT AccountId FROM Opportunity)としています。サブクエリ部分では商談オブジェクトを検索してAccountIdを取り出し、その中に取引先のIdが含まれていないかをチェックしています​。結果として、「商談を一度も持たない取引先」だけが抽出されます。逆に「商談を1件以上持つ取引先」を調べたい場合は、NOT INを使って同様の構文で取得できます。​

4. まとめ

いかがでしたでしょうか。

今回は、初級から上級まで商談オブジェクトに対するSOQLの書き方と活用例を解説しました。Salesforce管理者にとってSOQLを使いこなすことは、データを効率的に抽出・分析する上で大きな武器になります。最初はシンプルなクエリから始めて、徐々に条件指定や集計、サブクエリへとステップアップしていけば、必要な情報を自在に引き出せるようになるでしょう。

日常業務でも「レポートでは一手間かかる集計をSOQLですぐ確認する」「リストビューで見られない関連データを取得する」といった場面でぜひSOQLを活用してみてください。

5. お問い合わせ

現在Salesforceを効果的に活用できていない企業様や、これからSalesforceの導入を検討している企業様で、設定や運用、保守に関するサポートが必要な場合は、ぜひお気軽にご相談くださいませ!

    お問い合わせ目的

    Salesforceカテゴリの最新記事