Hasta ahora, hemos estado obteniendo datos de la base de datos mediante consultas simples y una única declaración SELECT. Sin embargo, de todos modos, más a menudo necesitaremos seleccionar datos que cumplan muchas condiciones, y aquí no podemos prescindir de consultas avanzadas. Para esto, en SQL existen subconsultas o consultas anidadas, donde una sentencia SELECT está anidada dentro de otra.
Una subconsulta es una declaración SELECT anidada dentro de otra SELECT, SELECT...INTO, INSERT...INTO, DELETE, UPDATE, o dentro de otra subconsulta.
El texto de la subconsulta debe estar entre paréntesis. Se suelen utilizar subconsultas en lugar de unir tablas (JOIN).
Las tablas de bases de datos utilizadas en DBMS Access son tablas relacionales, es decir, todas las tablas pueden vincularse entre sí mediante campos comunes. Supongamos que almacenamos datos en dos tablas diferentes y necesitamos seleccionar datos en una de ellas, dependiendo de qué datos hay en la otra. Para ello crearemos otra tabla en nuestra base de datos. Esta será, por ejemplo, la tabla Sellers con información sobre proveedores:
Ahora tenemos dos tablas: Sumproduct y Sellers que tienen el mismo campo City. Digamos que necesitamos contar cuántos productos se vendieron sólo en Canadá. Las subconsultas nos ayudarán a hacer esto. Entonces, primero, escribamos una consulta para una muestra de ciudades ubicadas en Canadá:
Run SQLSELECT City
FROM Sellers
WHERE Country = 'Canada'
Ahora pasemos estos datos a la siguiente consulta, que seleccionará datos de la tabla Sumproduct:
Run SQLSELECT SUM(Quantity) AS Qty_Canada
FROM Sumproduct
WHERE City IN ('Montreal','Toronto')
También podemos combinar estas dos solicitudes en una. Por lo tanto, una solicitud que genera datos será la principal y la segunda solicitud que transfiere datos de entrada será una auxiliar (subconsulta). Para insertar una subconsulta utilizaremos la construcción WHERE... IN (...), que se analizó en el apartado Filtrado avanzado:
Run SQLSELECT SUM(Quantity) AS Qty_Canada
FROM Sumproduct
WHERE City IN (SELECT City
FROM Sellers
WHERE Country = 'Canada')
Podemos ver que obtuvimos los mismos datos que con dos consultas separadas. De la misma manera, podemos aumentar la profundidad de anidamiento de las consultas anidando subconsultas tantas veces como queramos.
También podemos utilizar subconsultas como campos calculados. Mostremos, por ejemplo, la cantidad de productos vendidos para cada vendedor usando la siguiente consulta:
Run SQLSELECT Seller_name, (SELECT SUM(Quantity)
FROM Sumproduct
WHERE Sellers.City = Sumproduct.City) AS Qty
FROM Sellers
La primera declaración SELECT muestra dos columnas: Seller_name y Qty. El campo Qty se calcula, se forma como resultado de la ejecución de la subconsulta, que está entre paréntesis. Esta subconsulta se ejecuta una vez para cada registro en el campo Seller_name y se ejecutará cuatro veces en total ya que se seleccionan cuatro nombres de vendedores.
Además, en la subconsulta, la cláusula WHERE realiza la función de unión, pues con ayuda de WHERE unimos las dos tablas por el campo City, usando los nombres completos de las columnas (Table.Field).