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 的用法 » 查询和修改数据 » 连接:从多个表检索数据 » 专用连接

 

从 apply 表达式生成的连接

apply 表达式是一种指定右侧取决于左侧的连接的简单方式。例如,使用一个 apply 表达式来计算过程或派生表,在表表达式中每行计算一次。apply 表达式位于 SELECT 语句的 FROM 子句中,不允许使用 ON 子句。

APPLY 组合多个源的行,类似于 JOIN,只不过不能为 APPLY 指定 ON 条件。APPLY 和 JOIN 之间的主要差别在于 APPLY 的右侧可以根据左侧的当前行发生改变。针对左侧各行,重新计算右侧,生成的行与左侧的行连接。在左侧的行在右侧返回多个行的情况下,右侧返回多少行,左侧就在结果中重复多少次。

您可以指定两种类型的 APPLY:CROSS APPLY 和 OUTER APPLY。CROSS APPLY 仅在左侧返回可在右侧产生结果的行。OUTER APPLY 返回所有 CROSS APPLY 返回的行,还在左侧返回不能在右侧返回行的所有行(通过为右侧提供 NULL)。

apply 表达式的语法如下:

table-expression { CROSS | OUTER } APPLY table-expression
示例

下面的示例创建一个过程 EmployeesWithHighSalary,将部门 ID 作为输入,并返回在该部门中薪水大于 $80,000 的所有雇员姓名。

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 名称
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 );
另请参见