Поделиться через


Вложенные запросы с операторами сравнения

Вложенные запросы могут начинаться с одного из операторов сравнения (=, < >, >, > =, <, ! >, ! <, или < =).

Вложенный запрос, начинающийся с немодифицированного оператора сравнения (оператора сравнения, за которым не следуют ключевые слова ANY или ALL), должен возвратить одиночное значение, а не список значений, как вложенные запросы, начинающиеся с IN. Если такой вложенный запрос возвращает более одного значения, MicrosoftSQL Server сформирует сообщение об ошибке.

Чтобы использовать подзапрос, начинающийся с немодифицированного оператора сравнения, необходимо достаточно хорошо знать свои данные и природу проблемы, чтобы быть уверенным, что вложенный запрос возвратит точно одно значение.

Например, если предполагается, что каждый менеджер по продажам отвечает только за одну территорию продаж, и нужно найти клиентов, расположенных на территории, за которую отвечает Линда Митчелл, можно написать инструкцию с вложенным запросом, начинающимся с простого оператора сравнения =.

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

Однако если Линда Митчелл работала более чем с одной территорией продаж, то результатом будет сообщение об ошибке. Вместо оператора сравнения = может использоваться формулировка IN (= ANY также работает).

Вложенные запросы, начинающиеся с немодифицированных операторов сравнения, часто включают статистические функции, потому что они возвращают одиночное значение. Например, следующая инструкция находит названия всех продуктов, у которых цена по прейскуранту больше, чем средняя цена по прейскуранту.

Use AdventureWorks
SELECT Name
FROM Production.Product
WHERE ListPrice >
    (SELECT AVG (ListPrice)
     FROM Production.Product)

Поскольку вложенные запросы, начинающиеся с немодифицированных операторов сравнения, должны возвращать одиночное значение, они не могут включать предложения GROUP BY или HAVING (за исключением случаев, когда достоверно известно, что предложение GROUP BY или HAVING возвратит одиночное значение). Например, следующий запрос находит продукты, оцененные выше, чем самый дешевый продукт, который находится в подкатегории 14.

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

См. также

Основные понятия