A veces puede que desee usar los resultados de una consulta como un campo en otra consulta o como un criterio para un campo de consulta. Por ejemplo, supongamos que desea ver el intervalo entre los pedidos de cada uno de los productos. Para crear una consulta que muestre este intervalo, debe comparar cada fecha de pedido con otras fechas de pedido para ese producto. Comparar estas fechas de pedido también requiere una consulta. Puede anidar esta consulta dentro de la consulta principal mediante un subconsulta.
Puede escribir una subconsulta en una expresión o en una instrucción Lenguaje de consulta estructurado (SQL) en vista SQL.
En este artículo
Usar los resultados de una consulta como campo en otra consulta
Puede usar una subconsulta como alias de campo. Use una subconsulta como alias de campo cuando desee usar los resultados de la subconsulta como un campo de la consulta principal.
Nota: Una subconsulta que se usa como alias de campo no puede devolver más de un campo.
Puede usar un alias de campo de subconsulta para mostrar valores que dependen de otros valores de la fila actual, lo que no es posible sin usar una subconsulta.
Por ejemplo, volvamos al ejemplo en el que desea ver el intervalo entre los pedidos de cada uno de sus productos. Para determinar este intervalo, debe comparar cada fecha de pedido con otras fechas de pedido para ese producto. Puede crear una consulta que muestre esta información con la plantilla de base de datos Northwind.
-
En la pestaña Archivo, haga clic en Nuevo.
-
En Plantillas disponibles,haga clic en Plantillas de ejemplo.
-
Haga clic en Northwindy, a continuación, haga clic en Crear.
-
Siga las instrucciones que aparecen en la página Northwind Traders (en la pestaña de objeto Pantalla de inicio) para abrir la base de datos y, a continuación, cierre la ventana Cuadro de diálogo de inicio de sesión.
-
En la pestaña Crear del grupo Consultas, haga clic en Diseño de consulta.
-
Haga clic en la pestaña Consultas y, después, haga doble clic en Pedidos de producto.
-
Haga doble clic en el campo Id. de producto y en el campo Fecha de pedido para agregarlos a la cuadrícula de diseño de la consulta.
-
En la fila Ordenar de la columna Id. de producto de la cuadrícula, seleccione Ascendente.
-
En la fila Ordenar de la columna Fecha de pedido de la cuadrícula, seleccione Descendente.
-
En la tercera columna de la cuadrícula, haga clic con el botón derecho en la fila Campo y, a continuación, haga clic en Zoom en el menú contextual.
-
En el cuadro de diálogo Zoom, escriba o pegue la siguiente expresión:
Prior Date: (SELECT MAX([Order Date])
FROM [Product Orders] AS [Old Orders]
WHERE [Old Orders].[Order Date] < [Product Orders].[Order Date]
AND [Old Orders].[Product ID] = [Product Orders].[Product ID])Esta expresión es la subconsulta. Para cada fila, la subconsulta selecciona la fecha de pedido más reciente que es menos reciente que la fecha de pedido que ya está asociada a la fila. Observe cómo se usa la palabra clave AS para crear un alias de tabla, de modo que pueda comparar los valores de la subconsulta con los valores de la fila actual de la consulta principal.
-
En la cuarta columna de la cuadrícula, en la fila Campo, escriba la siguiente expresión:
Interval: [Order Date]-[Prior Date]
Esta expresión calcula el intervalo entre cada fecha de pedido y la fecha de pedido anterior para ese producto, usando el valor de fecha anterior que definimos mediante una subconsulta.
-
En la pestaña Diseño, en el grupo Resultados, haga clic en Ejecutar.
-
La consulta se ejecuta y muestra una lista de nombres de producto, fechas de pedido, fechas de pedido anteriores y el intervalo entre fechas de pedido. Los resultados se ordenan primero por Id. de producto (en orden ascendente) y después por Fecha de pedido (en orden descendente).
-
Nota: Como id. de producto es un campo de búsqueda, Access muestra de forma predeterminada los valores de búsqueda (en este caso, el nombre del producto), en lugar de los id. de producto reales. Aunque esto cambia los valores que aparecen, no cambia el criterio de ordenación.
-
-
Cierre la base de datos de Northwind.
Usar una subconsulta como criterio para un campo de consulta
Puede usar una subconsulta como criterio de campo. Use una subconsulta como criterio de campo cuando desee usar los resultados de la subconsulta para limitar los valores que muestra el campo.
Por ejemplo, supongamos que desea revisar una lista de pedidos que han sido procesados por empleados que no son representantes de ventas. Para generar esta lista, debe comparar el id. de empleado de cada pedido con una lista de los identificadores de empleado para los empleados que no son representantes de ventas. Para crear esta lista y usarla como criterio de campo, use una subconsulta, como se muestra en el procedimiento siguiente:
-
Abra Northwind.accdb y habilite su contenido.
-
Cierre el formulario de inicio de sesión.
-
En la ficha Crear, en el grupo Otros, haga clic en Diseño de la consulta.
-
En la pestaña Tablas, haga doble clic en Pedidos y empleados.
-
En la tabla Pedidos, haga doble clic en el campo Id. de empleado, el campo Id. de pedido y el campo Fecha de pedido para agregarlos a la cuadrícula de diseño de la consulta. En la tabla Empleados, haga doble clic en el campo Puesto de trabajo para agregarlo a la cuadrícula de diseño.
-
Haga clic con el botón derecho en la fila Criterios de la columna Id. de empleado y, a continuación, haga clic en Zoom en el menú contextual.
-
En el cuadro Zoom, escriba o pegue la siguiente expresión:
IN (SELECT [ID] FROM [Employees]
WHERE [Job Title]<>'Sales Representative')Esta es la subconsulta. Selecciona todos los IDs de empleado en los que el empleado no tiene un puesto de representante de ventas y proporciona el resultado establecido en la consulta principal. A continuación, la consulta principal comprueba si los datos de los empleados de la tabla Pedidos están en el conjunto de resultados.
-
En la pestaña Diseño, en el grupo Resultados, haga clic en Ejecutar.
La consulta se ejecuta y los resultados de la consulta muestran una lista de los pedidos que han procesado los empleados que no son representantes de ventas.
Palabras SQL que puede usar con una subconsulta
Hay varias palabras SQL palabras clave que puede usar con una subconsulta:
Nota: Esta lista no es exhaustiva. Puede usar cualquier palabra clave SQL en una subconsulta, excluyendo las palabras clave de definición de datos.
-
ALL Use ALL en una cláusula WHERE para recuperar filas que cumplan la condición en comparación con todas las filas devueltas por la subconsulta.
Por ejemplo, supongamos que está analizando datos de alumnos en una universidad. Los alumnos deben mantener un GPA mínimo, que varía de mayor a mayor. Los principales y sus GPO mínimos se almacenan en una tabla denominada Principales y la información relevante de los alumnos se almacena en una tabla denominada Student_Records.
Para ver una lista de las principales (y sus GDA mínimas) para las que todos los alumnos con ese nivel superior superan el GPA mínimo, puede usar la consulta siguiente:
SELECT [Major], [Min_GPA]
FROM [Majors]
WHERE [Min_GPA] < ALL
(SELECT [GPA] FROM [Student_Records]
WHERE [Student_Records].[Major]=[Majors].[Major]); -
ANY Use ANY en una cláusula WHERE para recuperar filas que cumplan la condición en comparación con al menos una de las filas devueltas por la subconsulta.
Por ejemplo, supongamos que está analizando datos de alumnos en una universidad. Los alumnos deben mantener un GPA mínimo, que varía de mayor a mayor. Los principales y sus GPO mínimos se almacenan en una tabla denominada Principales y la información relevante de los alumnos se almacena en una tabla denominada Student_Records.
Para ver una lista de las principales (y sus GDA mínimas) para las que cualquier alumno con ese nivel de estudios no cumple el GPA mínimo, puede usar la consulta siguiente:
SELECT [Major], [Min_GPA]
FROM [Majors]
WHERE [Min_GPA] > ANY
(SELECT [GPA] FROM [Student_Records]
WHERE [Student_Records].[Major]=[Majors].[Major]);Nota: También puede usar la palabra clave SOME para el mismo fin; la palabra clave SOME es sinónimo de ANY.
-
EXISTS Use EXISTS en una cláusula WHERE para indicar que una subconsulta debe devolver al menos una fila. También puede prefacio EXISTE con NO, para indicar que una subconsulta no debe devolver ninguna fila.
Por ejemplo, la consulta siguiente devuelve una lista de productos que se encuentran en al menos un pedido existente:
SELECT *
FROM [Products]
WHERE EXISTS
(SELECT * FROM [Order Details]
WHERE [Order Details].[Product ID]=[Products].[ID]);Con NO EXISTE, la consulta devuelve una lista de productos que no se encuentran en al menos un pedido existente:
SELECT *
FROM [Products]
WHERE NOT EXISTS
(SELECT * FROM [Order Details]
WHERE [Order Details].[Product ID]=[Products].[ID]); -
IN Use IN en una cláusula WHERE para comprobar que un valor de la fila actual de la consulta principal forma parte del conjunto que devuelve la subconsulta. También puede prefacio IN con NOT, para comprobar que un valor de la fila actual de la consulta principal no forma parte del conjunto que devuelve la subconsulta.
Por ejemplo, la consulta siguiente devuelve una lista de pedidos (con fechas de pedido) que han sido procesados por empleados que no son representantes de ventas:
SELECT [Order ID], [Order Date]
FROM [Orders]
WHERE [Employee ID] IN
(SELECT [ID] FROM [Employees]
WHERE [Job Title]<>'Sales Representative');Si usa NOT IN, podría escribir la misma consulta de esta manera:
SELECT [Order ID], [Order Date]
FROM [Orders]
WHERE [Employee ID] NOT IN
(SELECT [ID] FROM [Employees]
WHERE [Job Title]='Sales Representative');