Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (日本語) » SQL Anywhere サーバ - SQL の使用法 » データのクエリと変更 » ジョイン:複数テーブルからのデータ検索 » 特殊なジョイン

 

適用式から生成されるジョイン

適用式を使用すると、右側が左側に依存するジョインを簡単に指定できます。たとえば、適用式を使用して、テーブル式内のローごとに 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 );
参照