APPLY 演算子を使用する
SQL Server には、2 つのセットの行を結合または比較する代わりに、一方のセットのテーブル式を他のセットの各行に適用するメカニズムが用意されています。 APPLY 演算子を使用すると、1 つの入力セット内の行を、2 番目の入力セットを定義する式に対して評価するクエリが有効になります。 APPLY は実際には、set 演算子ではなくテーブル演算子であり、FROM 句の一部です。 APPLY は、2 つの互換性のあるクエリの結果セットを操作するセット演算子としてではなく、JOIN に似ています。
概念的には、APPLY 演算子は、関連付けられたテーブル式をテーブルの各行に適用するという点で、相関サブクエリに似ています。 ただし、APPLY はスカラーまたは複数値の結果ではなく、テーブル値の結果を返します。 たとえば、テーブル式にはテーブル値関数を指定できます。 左行の要素を入力パラメーターとしてテーブル値関数に渡すことができます。
APPLY には 2 つの形式があります。
- CROSS APPLY
- OUTER APPLY
APPLY の構文は次のとおりです。
SELECT <column_list>
FROM left_table_source { CROSS | OUTER } APPLY right_table_source
これは、例で説明するのが最善です。 最初の例では、INNER JOIN を使用して次のテーブルから列を返します。
- SalesLT.SalesOrderHeader。
- SalesLT.SalesOrderDetail。
次のコード例では、テーブルは INNER JOIN を使用して結合されます。
SELECT oh.SalesOrderID, oh.OrderDate,od.ProductID, od.UnitPrice, od.Orderqty
FROM SalesLT.SalesOrderHeader AS oh
INNER JOIN SalesLT.SalesOrderDetail AS od
ON oh.SalesOrderID = od.SalesOrderID;
次のコード例では、CROSS APPLY によって、左側のテーブル ソースの各行に右のテーブル ソースが適用されます。 左側のテーブルと右のテーブルの両方に結果がある行のみが返されます。 ほとんどの INNER JOIN ステートメントは CROSS APPLY ステートメントとして書き換えることができます。
SELECT oh.SalesOrderID, oh.OrderDate,
od.ProductID, od.UnitPrice, od.Orderqty
FROM SalesLT.SalesOrderHeader AS oh
CROSS APPLY (SELECT productid, unitprice, Orderqty
FROM SalesLT.SalesOrderDetail AS od
WHERE oh.SalesOrderID = SalesOrderID
) AS od;
どちらの場合も、結果セットは同じです。