使用比较运算符的子查询

子查询可以由一个比较运算符(=、< >、>、> =、<、! >、! < 或 < =)引入。

与使用 IN 引入的子查询一样,由未修饰的比较运算符(即后面不接 ANY 或 ALL 的比较运算符)引入的子查询必须返回单个值而不是值列表。如果这样的子查询返回多个值,SQL Server 将显示一条错误信息。

要使用由未修改的比较运算符引入的子查询,必须对数据和问题的本质非常熟悉,以了解该子查询实际是否只返回一个值。

例如,如果假定每个销售员只负责一块销售区域,而您要找出 Linda Mitchell 所负责区域的客户,那么您可以编写一条语句,带上简单的 = 比较运算符引入的子查询。

USE AdventureWorks2008R2;
GO
SELECT CustomerID
FROM Sales.Customer
WHERE TerritoryID =
    (SELECT TerritoryID
     FROM Sales.SalesPerson
     WHERE BusinessEntityID = 276)

但是,如果 Linda Mitchell 负责的销售区域不止一个,则会产生一条错误信息。这时可以用 IN 表达式(= ANY 也可以)来代替 = 比较运算符。

由未修改的比较运算符引入的子查询经常包括聚合函数,因为这些子查询要返回单个值。例如,下面的语句将找出定价高于平均定价的所有产品的名称。

Use AdventureWorks2008R2;
GO
SELECT Name
FROM Production.Product
WHERE ListPrice >
    (SELECT AVG (ListPrice)
     FROM Production.Product)

因为由未修改的比较运算符引入的子查询必须返回单个值,所以除非知道 GROUP BY 或 HAVING 子句本身会返回单个值,否则不能包括 GROUP BY 或 HAVING 子句。例如,下面的查询将找出子类别 14 中定价高于最低定价的产品。

Use AdventureWorks2008R2;
GO
SELECT Name
FROM Production.Product
WHERE ListPrice >
    (SELECT MIN (ListPrice)
     FROM Production.Product
     GROUP BY ProductSubcategoryID
     HAVING ProductSubcategoryID = 14)

请参阅

概念