SQL Server (Transact-SQL) INTERSECT 子句用于返回两个或多个SELECT 语句。如果两个结果集中都存在一条记录,则它将包含在 INTERSECT 结果中。但是,如果一条记录存在于一个结果集中而不存在于另一个结果集中,则将从 INTERSECT 结果中删除该记录, 即用于求交集。

使用 INTERSECT 子句时,必须满足以下条件:

  • 每个 SELECT 语句中的列数应该相等。
  • 每个 SELECT 语句中的列的数据类型应该匹配。
  • 每个 SELECT 语句中的列顺序应该匹配。
SQL Server INTERSECT

语法

在 SQL Server (Transact-SQL) 中使用 INTERSECT 子句的语法如下:

SELECT column1, column2, ... FROM table1
INTERSECT
SELECT column1, column2, ... FROM table2 

示例:

考虑数据库名为 Product 和 Inventory 的表,其中包含以下记录:

表 1:Product 表

NameBrandPriceQuantity
AppleDelicious1.540
AppleHarvest1.650
OrangeDelicious2.040
OrangeHarvest1.950
WatermelonLocalFarm4.050
MangoLocalFarm3.560

表2:Inventory表

NameBrandPriceQuantity
AppleDelicious1.520
OrangeLocalFarm2.040
WatermelonLocalFarm4.020

使用 INTERSECT 子句: 要获取两个记录集中都存在的 Name 列的记录,可以使用以下查询:

SELECT Name FROM Product
INTERSECT
SELECT Name FROM Inventory
ORDER BY Name; 

这将产生如下所示的结果:

Name
Apple
Orange
Watermelon

将 INTERSECT 子句与 WHERE 子句一起使用: 获取以下记录Name 列在指定条件的两个记录集中都存在,可以使用以下语句:

SELECT Name FROM Product
INTERSECT
SELECT Name FROM Inventory
WHERE Quantity < 30
ORDER BY Name; 

这将产生以下结果:

Name
Apple
Watermelon

对多列使用 INTERSECT 子句: 获取 Name 和 Brand 列的记录两个记录集中都存在,查询将为:

SELECT Name, Brand FROM Product
INTERSECT
SELECT Name, Brand FROM Inventory
ORDER BY Name; 

这将产生以下结果:

NameBrand
AppleDelicious
WatermelonLocalFarm