SQL Server の APPLY オペレータ

SQL Server の APPLY オペレータ

SQL Server には SELECT や UPDATE などの FROM 句で使える APPLY というオペレータがあります。

APPLY には CROSS APPLY と OUTER APPLY があり、機能的には INNER JOIN と LEFT JOIN に似ています。

ユーザー定義のテーブル値関数と結合して、結果セットを返したいような時に便利です。

次のように、JOIN だと、右側のテーブル ソース(サブクエリー)に左側のテーブルソースのカラムを含めることができませんが、APPLY オペレーターを使うと左側のカラムを、右側に渡すことができます。

SQL Server の APPLY オペレータ 5


サンプルデータとユーザー定義のテーブル値関数

CROSS APPLY と OUTER APPLY を使うためのサンプルデータを準備します。

学生とテストの成績のデータを保存した、次のような Student、Test、TestResult テーブルがあります。

SQL Server の APPLY オペレータ 1

こちら のスクリプトを実行するとサンプルテーブル&データを生成できます。

ユーザー定義のテーブル値関数を作成する 」 のページで作った StudentID を受け取って、テストレポートの結果セットを返す ufnStudentTestReportGet というユーザー定義のテーブル値関数を使います。

SQL Server の APPLY オペレータ 2

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;

SQL Server の APPLY オペレータ 3


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;

SQL Server の APPLY オペレータ 4

OUTER APPLY を使うと、ufnStudentTestReportGet からレコードが返ってこない Student も結果セットに含まれます。

LEFT JOIN みたいな感じですね!


© 2010-2024 SQL Server 入門