Subconsultas com operadores de comparação

As subconsultas podem ser introduzidas com um dos operadores de comparação (=, < >, >, > =, <, ! >, ! < ou < =).

Uma subconsulta introduzida com um operador de comparação não modificado (um operador de comparação não seguido por ANY ou ALL) deve retornar um único valor em vez de uma lista de valores, tais como subconsultas introduzidas com IN. Se uma subconsulta desse tipo retornar mais de um valor, o SQL Server exibirá uma mensagem de erro.

Para usar uma subconsulta introduzida com um operador de comparação não modificado, você deve estar bastante familiarizado com seus dados e com a natureza do problema para saber que a subconsulta retornará exatamente um valor.

Por exemplo, se você pressupõe que cada vendedor só cobre um território de vendas e quiser achar os clientes localizados no território coberto por Linda Mitchell, você pode escrever uma instrução com uma subconsulta introduzida com o operador de comparação simples =.

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

No entanto, se Linda Mitchell cobrisse mais de um território de vendas, então uma mensagem de erro apareceria. Em vez do operador de comparação =, poderia ser usada uma formulação IN (= ANY também funciona).

Subconsultas introduzidas com operadores de comparação não modificados incluem frequentemente funções de agregação, porque elas retornam um único valor. Por exemplo, a instrução apresentada a seguir encontra os nomes de todos os produtos cujo preço da lista seja maior que o preço médio da lista.

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

Uma vez que as subconsultas introduzidas com operadores de comparação não modificados devem retornar um único valor, elas não podem incluir cláusulas GROUP BY ou HAVING, a menos que você saiba que a própria cláusula GROUP BY ou HAVING retorna um valor único. Por exemplo, a consulta a seguir encontra os produtos cujo preço é mais alto que o produto de preço mais baixo que está na subcategoria 14.

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

Consulte também

Conceitos