Subconsultas con operadores de comparación
Las subconsultas se pueden presentar con uno de los operadores de comparación (=, < >, >, > =, <, ! >, ! <, or < =).
Una subconsulta precedida de un operador de comparación sin modificar (un operador de comparación no seguido de ANY o ALL) debe devolver un valor individual en lugar de una lista de valores, al igual que las subconsultas precedidas de IN. Si tal subconsulta devuelve más de un valor, SQL Server muestra un mensaje de error.
Para usar una subconsulta presentada con un operador de comparación sin modificar, debe estar suficientemente familiarizado con los datos y con la naturaleza del problema para saber que la subconsulta devolverá exactamente un valor.
Por ejemplo, si supone que cada vendedor sólo cubre un territorio de ventas y desea localizar los clientes del territorio que cubre Linda Mitchell, puede escribir una instrucción con una subconsulta presentada con el operador de comparación =.
USE AdventureWorks2008R2;
GO
SELECT CustomerID
FROM Sales.Customer
WHERE TerritoryID =
(SELECT TerritoryID
FROM Sales.SalesPerson
WHERE BusinessEntityID = 276)
Sin embargo, si Linda Mitchell cubre más de un territorio de ventas, se genera un mensaje de error. En lugar del operador de comparación =, se podría usar una formulación IN (= ANY también funciona).
Las subconsultas presentadas con operadores de comparación sin modificar incluyen, a menudo, funciones de agregado, puesto que éstas devuelven un valor individual. Por ejemplo, la instrucción siguiente localiza los nombres de todos los productos cuya lista de precios es superior al precio medio de la lista.
Use AdventureWorks2008R2;
GO
SELECT Name
FROM Production.Product
WHERE ListPrice >
(SELECT AVG (ListPrice)
FROM Production.Product)
Puesto que las subconsultas presentadas con operadores de comparación sin modificar deben devolver un valor individual, no pueden incluir cláusulas GROUP BY o HAVING, a menos que sepa que las propias cláusulas devuelven un valor individual. Por ejemplo, la siguiente consulta busca los productos con un precio superior al producto con el precio mínimo incluido en la subcategoría 14.
Use AdventureWorks2008R2;
GO
SELECT Name
FROM Production.Product
WHERE ListPrice >
(SELECT MIN (ListPrice)
FROM Production.Product
GROUP BY ProductSubcategoryID
HAVING ProductSubcategoryID = 14)