SQL Server の APPLY オペレータ
SQL Server の APPLY オペレータ
SQL Server には SELECT や UPDATE などの FROM 句で使える APPLY というオペレータがあります。
APPLY には CROSS APPLY と OUTER APPLY があり、機能的には INNER JOIN と LEFT JOIN に似ています。
ユーザー定義のテーブル値関数と結合して、結果セットを返したいような時に便利です。
次のように、JOIN だと、右側のテーブル ソース(サブクエリー)に左側のテーブルソースのカラムを含めることができませんが、APPLY オペレーターを使うと左側のカラムを、右側に渡すことができます。
サンプルデータとユーザー定義のテーブル値関数
CROSS APPLY と OUTER APPLY を使うためのサンプルデータを準備します。
学生とテストの成績のデータを保存した、次のような Student、Test、TestResult テーブルがあります。
「 ユーザー定義のテーブル値関数を作成する 」 のページで作った StudentID を受け取って、テストレポートの結果セットを返す ufnStudentTestReportGet というユーザー定義のテーブル値関数を使います。
CROSS APPLY
まずは CROSS APPLY を使ってみましょう。
Student テーブルと ユーザー定義のテーブル値関数 ufnStudentTestReportGet を CROSS APPLY でつなげて結果セットを取得します。
その際に CROSS APPLY を使うと、ufnStudentTestReportGet からレコードが返ってこない Student は結果セットに含まれません。
SELECT S.StudentID, S.FirstName, S.LastName, TR.TestID, TR.TestName, TR.Score, TR.TestAvgScore FROM Student AS S CROSS APPLY dbo.ufnStudentTestReportGet(S.StudentID) AS TR ORDER BY S.StudentID, TR.TestID;
OUTER APPLY
次に、Student テーブルと ユーザー定義のテーブル値関数 ufnStudentTestReportGet を OUTER APPLY でつなげて結果セットを取得してみます。
SELECT S.StudentID, S.FirstName, S.LastName, TR.TestID, TR.TestName, TR.Score, TR.TestAvgScore FROM Student AS S OUTER APPLY dbo.ufnStudentTestReportGet(S.StudentID) AS TR ORDER BY S.StudentID, TR.TestID;
OUTER APPLY を使うと、ufnStudentTestReportGet からレコードが返ってこない Student も結果セットに含まれます。
LEFT JOIN みたいな感じですね!