第 1 部分:APPLY 与 JOIN
你可能知道,SQL Server 中的 JOIN 操作用于联接两个或多个表。但是,在 SQL Server 中,JOIN 操作不能用于将表与表值函数的输出联接起来。如果你没有听说过表值函数,这些函数是以表的形式返回数据。为了连接两个表表达式,SQL Server 2005 引入了 APPLY 运算符。在本篇文章中,我们将了解 APPLY 运算符与常规 JOIN 的不同之处。
关于 CROSS APPLY 和 OUTER APPLY
SQL Server 的 APPLY 运算符有两种变体:CROSS APPLY 和 OUTER APPLY:
- CROSS APPLY 运算符仅返回左表表达式(在其最终输出中)中与右表表达式匹配的那些行。 因此,CROSS APPLY 类似于 INNER JOIN,或者更准确地说,类似于具有相关子查询的 CROSS JOIN,其隐式联接条件为 1=1。
- OUTER APPLY 运算符返回左表表达式中的所有行,而不管其与右表表达式的匹配情况。对于右表表达式中没有相应匹配项的那些行,它在右表表达式的列中返回 NULL 值。 因此,OUTER APPLY 等效于 LEFT OUTER JOIN。
尽管可以使用普通的 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 )
CROSS APPLY vs INNER JOIN
这是一个由两部分组成的查询:第一个查询从 Department 表中选择数据,并使用 CROSS APPLY 为 Department 表的每条记录对 Employee 表求值;第二个查询只是将 Department 表与 Employee 表联接起来以产生相同的结果:
第 2 部分预告
在本文介绍了 APPLY 运算符之后,第 2 部分将概述使用 APPLY 和 JOIN 之间的区别,并会讲述 APPLY 的其他用途。