Salesforce環境におけるクエリ言語SOQLとは?
Salesforce Object Query Language(SOQL)とは、Salesforce環境において組織のデータから特定の情報を検索するために使用するクエリ言語です。
SOQLは広く使用されている SQL(Structured Query Language)のSELECTステートメントに似ていますがSalesforce データ専用に設計されています。よって、使用するにおいて、どこが異なるのかを把握しておく必要があります。
また、基本的にSOQLを使用するのは以下の通りです。
①データがどのオブジェクトに存在しているかを認識しており、次の操作を行う場合は、SOQL を使用します。
②1 つのオブジェクト、または相互に関連する複数のオブジェクトからデータを取得する。
指定された条件を満たすレコードの数をカウントする。
③クエリの一部として結果を並び替える。
④数値、日付、またはチェックボックス項目からデータを取得する。
Salesforce環境(SOQL)における「distinct」句の機能の実現

Salesforce環境でのSOQLとdistinct句の組み合わせを検索すると、「できない」などのネガティブメッセージや、重複除外にとても回りくどいやり方が必要になるような記事がたくさんヒットしてしまいます。もしかして、SOQLには「distinct」句は実装されていないのでしょうか?
結論から先に言いますと、SOQL(Salesforce Object Query Language )には、基本的にSQLにおける指定の重複項目を除外して表示する「select distinct~」分は現在存在しません。
代理策としてSQL、SOQL両方に用意されている「group by」句にて必要項目を指定しグループ化することで重複レコードを除外とします。
distinct句の代わりに「重複除外」として用いるgroup by句とは

「group by」句はSQLにおいては、SELECT文にてデータを取得する時に指定したカラム名の値を基準にグループ化をするのに使用します。この際に項目自体を重複除外してグループ化します。
つまり、必要項目すべてを「group by」句の引数として与えれば、その引数に与えた項目が同一レコードはひとつに集約され、SQL上で「select distinct~」の構文を書くのと同じ処理が可能です。
そして、項目ごとに複数レコードのクエリ結果をグループ化して結果表示を省略できるようにします。
これにより、別途、集計関数である、AVG(平均値を返す)、COUNT(該当レコードの行数を返す)、MIN(最小値を返す)、MAX(最大値を返す)、SUM(項目の合計値を返す)等を用いることができるようになります。
Salesforce環境におけるSOQLもだいたい同様の使い方ができますが、SOQLでは、GROUP BY句を省略して集計関数を使用することが可能です。また、後述する重複をはぶいて数をカウントするCount_distinctという集計関数があります。
集計関数「COUNT_DISTINCT」を使用する際の注意
SQLにおけるテーブル内の重複外レコードをカウントする「COUNT(DISTINCT fieldName)」という構文に対してSalesforce環境のSOQLでは該当する集計関数として「count_distinct」というものがあります。
ただし、注意しなければならない点は、クエリ条件に一致する「null以外」の個別の項目値の数のみを返すということです。例を示します。
下記の内容の「product」、「company」という項目をもつレコードのテーブル「Lead」があるとします。
A1 AAAAA
B2 BBBBB
C3
D4 DDDDD
これをcompany項目にて重複除外した上で項目数をカウントさせるとします。
SELECT COUNT_DISTINCT(company)
FROM Lead
これはnull値である3番目のレコードの項目は数えませんので結果は「3」となります。
null値も含んだ上で照会して項目数をカウントする場合
そこで、null値も含んだ上で照会して項目数をカウントする場合は 「group by」句を使用する必要があります。
SELECT COUNT(company)
FROM Lead
GROUP BY company
この結果はnull値である3番目のレコードの値もカウントされますので「4」となります。
データ検索で今までのSQLとSalesforce環境のSOQLの違いを把握するのが第一歩!
今回は、Salesforce環境にてDMLとして使用するSOQLが完全にはSQLと同じではない!例えば「selrct distinct~」構文はない!ということをご紹介させていただきました。
SQLを参考に作られたと言っても、SOQLは完全にSQLと同じではありません。基本的にレコードの読み込み専用としてSQLのselectコマンドの一部をサポートしている形です。
Salesforce環境は必要に応じて、更新、バージョンアップにて機能は追加されていますので将来的にSQLの機能が実装される可能性はゼロではありませんが、現状ではそこに違いがあることを認識したうえで同じ結果を導き出せる表記法を覚えておくことは大切です。]]>