適用式を使用すると、右側が左側に依存するジョインを簡単に指定できます。たとえば、適用式を使用して、テーブル式内のローごとに 1 回ずつプロシージャまたは派生テーブルを評価できます。適用式は SELECT 文の FROM 句内に配置し、ON 句を使用することはできません。
APPLY を使用すると複数のソースからローを結合できます。この動作は JOIN に似ていますが、APPLY には ON 条件を指定することはできません。APPLY と JOIN の主な相違点は、APPLY の右側は左側の現在のローによって変わる場合があるという点です。左側のローごとに、右側が再計算され、結果のローが左側のローに結合されます。左側の 1 つのローが右側の複数の行を返すケースでは、右側から返されたローの数だけ左側が重複する結果となります。
指定できる APPLY には、CROSS APPLY と OUTER APPLY の 2 つのタイプがあります。CROSS APPLY は、右側の結果を生成する左側のローのみを返します。OUTER APPLY は、CROSS APPLY が返すすべてのローと、(右側に NULL が入力されたため) 右側からローが返されない左側のすべてのローを返します。
適用式の構文は、次のとおりです。
table-expression { CROSS | OUTER } APPLY table-expression
次の例では、部署 ID を入力値として受け取り、その部署内で給与が 80,000 ドルを超えるすべての従業員の名前を返すプロシージャ EmployeesWithHighSalary を作成します。
CREATE PROCEDURE EmployeesWithHighSalary( IN dept INTEGER ) RESULT ( Name LONG VARCHAR ) BEGIN SELECT E.GivenName || ' ' || E.Surname FROM Employees E WHERE E.DepartmentID = dept AND E.Salary > 80000; END; |
次のクエリでは、OUTER APPLY を使用して Departments テーブルを EmployeesWithHighSalary プロシージャの結果にジョインし、各部署で給与が 80,000 ドルを超えるすべての従業員の名前を返します。また、このクエリでは、右側が NULL のローを返し、給与が 80,000 ドルを超える従業員が存在しない各部署も示します。
SELECT D.DepartmentName, HS.Name FROM Departments D OUTER APPLY EmployeesWithHighSalary( D.DepartmentID ) AS HS; |
DepartmentName | Name |
---|---|
R & D | Kim Lull |
R & D | David Scott |
R & D | John Sheffield |
Sales | Moira Kelly |
Finance | Mary Anne Shea |
Marketing | NULL |
Shipping | NULL |
次のクエリでは、CROSS APPLY を使用して Departments テーブルを EmployeesWithHighSalary プロシージャの結果にジョインします。この場合、右側に NULL が指定されたローは含まれません。
SELECT D.DepartmentName, HS.Name FROM Departments D CROSS APPLY EmployeesWithHighSalary( D.DepartmentID ) AS HS; |
DepartmentName | Name |
---|---|
R & D | Kim Lull |
R & D | David Scott |
R & D | John Sheffield |
Sales | Moira Kelly |
Finance | Mary Anne Shea |
次のクエリでは、前述のクエリと同じ結果が返されますが、CROSS APPLY の右側として派生テーブルが使用されます。
SELECT D.DepartmentName, HS.Name FROM Departments D CROSS APPLY ( SELECT E.GivenName || ' ' || E.Surname FROM Employees E WHERE E.DepartmentID = D.DepartmentID AND E.Salary > 80000 ) HS( Name ); |
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |