Subconsultas con IN

El resultado de una subconsulta especificada con IN (o con NOT IN) es una lista de cero o más valores. Una vez que la consulta devuelve los resultados, la consulta externa hace uso de ellos.

La siguiente consulta busca los nombres de todos los productos de ruedas que Adventure Works Cycles fabrica.

USE AdventureWorks2008R2;
GO
SELECT Name
FROM Production.Product
WHERE ProductSubcategoryID IN
    (SELECT ProductSubcategoryID
     FROM Production.ProductSubcategory
     WHERE Name = 'Wheels');

Este es el resultado:

Name

----------------------------

LL Mountain Front Wheel

ML Mountain Front Wheel

HL Mountain Front Wheel

LL Road Front Wheel

ML Road Front Wheel

HL Road Front Wheel

Touring Front Wheel

LL Mountain Rear Wheel

ML Mountain Rear Wheel

HL Mountain Rear Wheel

LL Road Rear Wheel

ML Road Rear Wheel

HL Road Rear Wheel

Touring Rear Wheel

(14 filas afectadas)

Esta instrucción se evalúa en dos pasos. En primer lugar, la consulta interior devuelve el número de identificación de subcategoría que coincide con el nombre 'Wheel' (17). En segundo lugar, este valor se sustituye en la consulta externa, que busca los nombres de productos asociados a los números de identificación de subcategoría en Product.

USE AdventureWorks2008R2;
GO
SELECT Name
FROM Production.Product
WHERE ProductSubcategoryID IN ('17');

Una diferencia de la utilización de una combinación en lugar de una subconsulta, para este problema y otros similares, es que la combinación permite mostrar, en el resultado, columnas de más de una tabla. Por ejemplo, si desea incluir en el resultado la subcategoría de nombre del producto, debe usar una versión con combinaciones.

Use AdventureWorks2008R2;
GO
SELECT p.Name, s.Name
FROM Production.Product p
INNER JOIN Production.ProductSubcategory s
ON p.ProductSubcategoryID = s.ProductSubcategoryID
AND s.Name = 'Wheels';

Este es el resultado:

Name Name

LL Mountain Front Wheel Wheels

ML Mountain Front Wheel Wheels

HL Mountain Front Wheel Wheels

LL Road Front Wheel Wheels

ML Road Front Wheel Wheels

HL Road Front Wheel Wheels

Touring Front Wheel Wheels

LL Mountain Rear Wheel Wheels

ML Mountain Rear Wheel Wheels

HL Mountain Rear Wheel Wheels

LL Road Rear Wheel Wheels

ML Road Rear Wheel Wheels

HL Road Rear Wheel Wheels

Touring Rear Wheel Wheels

(14 filas afectadas)

En la siguiente consulta se busca el nombre de todos los proveedores cuya solvencia de crédito sea buena, de los que Adventure Works Cycles solicita al menos 20 artículos y cuyo tiempo hasta la entrega es de menos de 16 días.

Use AdventureWorks2008R2;
GO
SELECT Name
FROM Purchasing.Vendor
WHERE CreditRating = 1
AND BusinessEntityID IN
    (SELECT BusinessEntityID
     FROM Purchasing.ProductVendor
     WHERE MinOrderQty >= 20
     AND AverageLeadTime < 16);

Este es el resultado:

Name

--------------------------------------------------

Compete Enterprises, Inc

International Trek Center

First National Sport Co.

Comfort Road Bicycles

Circuit Cycles

First Rate Bicycles

Jeff's Sporting Goods

Competition Bike Training Systems

Electronic Bike Repair & Supplies

Crowley Sport

Expert Bike Co

Team Athletic Co.

Compete, Inc.

(13 filas afectadas)

Se evalúa la consulta interna, que da como resultado los números de identificación de los proveedores que cumplen las calificaciones de la subconsulta. Después se evalúa la consulta externa. Observe que puede incluir más de una condición en la cláusula WHERE tanto de la consulta interna como de la externa.

Mediante una combinación, la misma consulta se expresa de esta forma:

USE AdventureWorks2008R2;
GO
SELECT DISTINCT Name
FROM Purchasing.Vendor v
INNER JOIN Purchasing.ProductVendor p
ON v.BusinessEntityID = p.BusinessEntityID
WHERE CreditRating = 1
AND MinOrderQty >= 20
AND AverageLeadTime < 16;

Una combinación se puede expresar siempre como una subconsulta. Una subconsulta se puede expresar a menudo, aunque no siempre, como una combinación. Esto es así porque las combinaciones son simétricas: si combina la tabla A con a la B en cualquier orden obtendrá la misma respuesta. Esto no es cierto si se implica a una subconsulta.

Vea también

Conceptos