SQL Server 的 INTERSECT 是集合运算符之一,它从左侧查询(左表)和右侧查询(右表)返回所有共同记录。本文将向您展示如何在 SELECT 语句中使用 INTERSECT 及其用例场景。
INTERSECT 运算符允许您查找跨表的公共行。在实际应用中,您可以使用此运算符来合并不同平台或地区的销售数据,以发现购买模式。
当有两个表时,我们可以称之为左表和右表。通常,SQL Server 的 INTERSECT 运算符会合并两个或多个 SELECT 语句中的行,删除不共同或唯一的记录,并返回匹配的行。最好的部分是它会删除重复的行。
SQL INTERSECT
以下是 INTERSECT 运算符的一组规则
- 首先,所有 SELECT 语句中的列数必须相同。
- 列数据类型应相互兼容。
- 第三,所有 SELECT 语句中的列的顺序必须相同。
在实际示例之前,下面的图片将帮助您理解 EXCEPT 和 INTERSECT 运算符。

SQL Server INTERSECT 语法
Intersect 背后的语法是
SELECT Column_Name1, Column_Name2 ......., Column_NameN FROM Table1 INTERSECT SELECT Column_Name1, Column_Name2 ......., Column_NameN FROM Table2
从语法定义本身可以看出,intersect 运算符逐行执行,并查找所有 select 语句中存在的行。下图显示了交集的图示表示。

为了进行演示,我们将在数据库中使用两个表。从下图可以看出,[Employ] 表有十条记录

而 [Employees 2016] 表有四行。只有一个不同的记录(9, Rob, Verhoff),其余三条是相同的。

SQL Server Intersect 示例
INTERSECT 通常用于检索两个表之间的公共记录。以下查询返回 Employ 和 Employees 2016 表中的所有公共记录,并显示结果集。
SELECT [ID]
,[FirstName]
,[LastName]
,[Occupation]
,[YearlyIncome]
,[Sales]
FROM [Employ]
INTERSECT
SELECT [ID]
,[FirstName]
,[LastName]
,[Occupation]
,[YearlyIncome]
,[Sales]
FROM [Employees 2016]

SQL Server Intersect WHERE 子句示例
以下查询展示了如何将此运算符与 WHERE 子句一起使用。在此示例中,我们组合了两个语句
- 第一个 SQL Server 结果集从 Employ 中选择记录,其年收入大于或等于 70000
- 第二个结果集选择 [Employees 2016] 表中的所有记录。
- 此运算符选择第一个结果集和第二个结果集中的所有公共记录。
SELECT [ID]
,[FirstName]
,[LastName]
,[Occupation]
,[YearlyIncome]
,[Sales]
FROM [Employ]
WHERE [YearlyIncome] >= 70000
INTERSECT
SELECT [ID]
,[FirstName]
,[LastName]
,[Occupation]
,[YearlyIncome]
,[Sales]
FROM [Employees 2016]

Intersect 错误 – 列和数据类型不匹配
以下查询将显示在此 SQL Intersect 查询中工作时常见的错误。为此,我们将使用数据库中存在的两个表(Employee 和 [Employees 2016])。下图显示 [Employee] 表有 7 列和 14 行。

让我们看看当我们选择两个表中的所有列时出现的问题。首先,这意味着对不相等长度的列执行 intersect 操作。
SELECT [FirstName]
,[LastName]
,[Education]
,[Occupation]
,[YearlyIncome]
,[Sales]
,[HireDate]
FROM [Employee]
INTERSECT
SELECT * FROM [Employees 2016]
Messages
--------
Msg 205, Level 16, State 1, Line 2
All queries combined using operator must have an equal number of expressions in their target lists.
我想您能读懂这条消息。现在,让我们稍微更改一下查询以选择相同数量的列。
SELECT [FirstName]
,[LastName]
,[Occupation]
,[YearlyIncome]
,[Sales]
FROM [Employee]
INTERSECT
SELECT [FirstName]
,[LastName]
,[Occupation]
,[YearlyIncome]
,[Sales]
FROM [Employees 2016]
从下面的 Intersect 屏幕截图中,您可以看到它返回了 3 条记录。因为只有一个不同的记录(Rob, Verhoff),[Employees 2016] 中的其余三条记录也存在于 Employee 表中。我们的运算符仅选择两个表中的公共记录。

评论已关闭。