Вложенные запросы с операторами сравнения
Вложенные запросы могут быть введены с помощью одного из операторов сравнения (=, < >, >, > =, <, ! >, ! < или < =).
Вложенный запрос, введенный с помощью немодифицированного оператора сравнения (оператора сравнения, за которым не следуют ключевые слова ANY или ALL), должен возвратить одиночное значение, а не список значений, как вложенные запросы, введенные с помощью IN. Если такой вложенный запрос возвращает более одного значения, то SQL Server отображает сообщение об ошибке.
Чтобы использовать подзапрос, начинающийся с немодифицированного оператора сравнения, необходимо достаточно хорошо знать свои данные и природу проблемы, чтобы быть уверенным, что вложенный запрос возвратит точно одно значение.
Например, если предполагается, что каждый менеджер по продажам отвечает только за одну территорию продаж, и нужно найти клиентов, расположенных на территории, за которую отвечает Линда Митчелл, можно написать инструкцию с вложенным запросом, начинающимся с простого оператора сравнения =.
USE AdventureWorks2008R2;
GO
SELECT CustomerID
FROM Sales.Customer
WHERE TerritoryID =
(SELECT TerritoryID
FROM Sales.SalesPerson
WHERE BusinessEntityID = 276)
Однако если Линда Митчелл работала более чем с одной территорией продаж, то результатом будет сообщение об ошибке. Вместо оператора сравнения = может использоваться формулировка 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)