你可能知道,SQL Server 中的 JOIN 操作用于联接两个或多个表。但是,在 SQL Server 中,JOIN 操作不能用于将表与表值函数的输出联接起来。如果你没有听说过表值函数,这些函数是以表的形式返回数据。为了连接两个表表达式,SQL Server 2005 引入了 APPLY 运算符。在本篇文章中,我们将了解 APPLY 运算符与常规 JOIN 的不同之处。
SQL Server 的 APPLY 运算符有两种变体:CROSS APPLY 和 OUTER APPLY:
尽管可以使用普通的 JOIN 编写相同的查询,但当右侧有一个表值表达式并且你希望为左侧表表达式中的每一行计算此表值表达式时,就需要使用 APPLY。此外,在某些情况下,使用 APPLY 运算符可以提高查询性能。
让我们通过一些示例进一步探索 APPLY 运算符。
我们将在Navicat for SQL Server中执行查询以创建的两个新表。这是 Department 表的设计:

这是 Employee 表的设计:

在 Navicat 查询编辑器中执行以下 SQL 以填充表:
- INSERT [Department] ([DepartmentID], [Name])
- VALUES (1, N'Engineering')
- INSERT [Department] ([DepartmentID], [Name])
- VALUES (2, N'Administration')
- INSERT [Department] ([DepartmentID], [Name])
- VALUES (3, N'Sales')
- INSERT [Department] ([DepartmentID], [Name])
- VALUES (4, N'Marketing')
- INSERT [Department] ([DepartmentID], [Name])
- VALUES (5, N'Finance')
- GO
-
- INSERT [Employee] ([EmployeeID], [FirstName], [LastName], [DepartmentID])
- VALUES (1, N'Orlando', N'Gee', 1 )
- INSERT [Employee] ([EmployeeID], [FirstName], [LastName], [DepartmentID])
- VALUES (2, N'Keith', N'Harris', 2 )
- INSERT [Employee] ([EmployeeID], [FirstName], [LastName], [DepartmentID])
- VALUES (3, N'Donna', N'Carreras', 3 )
- INSERT [Employee] ([EmployeeID], [FirstName], [LastName], [DepartmentID])
- VALUES (4, N'Janet', N'Gates', 3 )
这是一个由两部分组成的查询:第一个查询从 Department 表中选择数据,并使用 CROSS APPLY 为 Department 表的每条记录对 Employee 表求值;第二个查询只是将 Department 表与 Employee 表联接起来以产生相同的结果:

在本文介绍了 APPLY 运算符之后,第二部分将概述使用 APPLY 和 JOIN 之间的区别,并会讲述 APPLY 的其他用途。如果你想试用 Navicat 16,可以在这里下载 Navicat 的 14 天全功能免费试用版。