Anidar una consulta dentro de otra consulta o una expresión mediante una subconsulta

En ocasiones, quizás desee utilizar los resultados de una consulta como campo de otra consulta o como criterio para un campo de consulta. Por ejemplo, supongamos que desea ver el intervalo entre los pedidos de cada uno de sus productos. Para crear una consulta que muestre este intervalo, debe comparar cada fecha de pedido con las otras fechas de pedido para ese producto. La comparación de esas fechas de pedido también requiere una consulta. Puede anidar esta consulta dentro de la consulta principal mediante una subconsulta (subconsulta: instrucción SQL SELECT que está dentro de otra consulta de selección o de acción.).

Puede escribir una subconsulta en una expresión (expresión: cualquier combinación de operadores matemáticos o lógicos, constantes, funciones y nombres de campos, controles y propiedades que evalúa a un solo valor. Las expresiones pueden realizar cálculos, manipular caracteres o probar datos.) o una instrucción SQL (Lenguaje de consulta estructurado) en la vista SQL (vista SQL: ficha de objeto que muestra la instrucción SQL para la consulta activa o que se usa para crear una consulta específica de SQL (unión, paso a través o definición de datos). Cuando se crea una consulta en la vista Diseño, se construye el SQL equivalente en la vista SQL.).

En este artí­culo


Utilizar los resultados de una consulta como campo de otra consulta

Puede utilizar una subconsulta como alias (alias (SQL): nombre alternativo para una tabla o campo en expresiones. Los alias se utilizan a menudo para acortar el nombre de una tabla o de un campo para referencias posteriores en el código, a fin de evitar posibles referencias ambiguas o para proporcionar un nombre más descriptivo en los resultados de una consulta.) de campo. Utilice una subconsulta como alias de campo cuando desee utilizar los resultados de la subconsulta como campo en la consulta principal.

 Nota   Una subconsulta que se utiliza como alias de campo no puede devolver más de un campo.

Puede utilizar un alias de campo para mostrar valores que dependen de otros valores de la fila actual, lo cual no es posible si no se utiliza una subconsulta.

Por ejemplo, volvamos al ejemplo donde desea ver el intervalo entre los pedidos de cada uno de sus productos. Para determinar este intervalo, debe comparar cada fecha de pedido con las otras fechas de pedido para ese producto. Puede crear una consulta que muestre esta información mediante la plantilla de la base de datos Northwind.

MostrarMostrar cómo configurar Northwind

  1. En la ficha Archivo, haga clic en Nuevo.
  2. En Plantillas disponibles, haga clic en Plantillas de ejemplo.
  3. Haga clic en Northwind y, a continuación, en Crear.
  4. Siga las instrucciones que aparecen en la página Northwind Traders (en la ficha 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.

  1. En el grupo Consultas de la ficha Crear, haga clic en Diseño de consulta.
  2. En el cuadro de diálogo Mostrar tabla, haga clic en la pestaña Consultas y, a continuación, haga doble clic en Pedidos de productos.
  3. Cierre el cuadro de diálogo Mostrar tabla.
  4. Haga doble clic en el campo Id de producto y el campo Fecha de pedido para agregarlos a la cuadrícula de diseño de la consulta.
  5. En la fila Orden de la columna Id de producto de la cuadrícula, seleccione Ascendente.
  6. En la fila Orden de la columna Fecha de pedido de la cuadrícula, seleccione Descendente.
  7. En la tercera columna de la cuadrícula, haga clic con el botón secundario en la fila Campo y, a continuación, haga clic en Zoom en el menú contextual.
  8. En el cuadro de diálogo Zoom, escriba o pegue la siguiente expresión:
Fecha anterior: (SELECT MAX([Fecha de pedido]) 
FROM [Pedidos de productos] AS [Pedidos antiguos] 
WHERE [Pedidos antiguos].[Fecha de pedido] < [Pedidos de productos].[Fecha de pedido] 
AND [Pedidos antiguos].[Id de producto] = [Pedidos de productos].[Id de producto])

Esta expresión es la subconsulta. Para cada fila, la subconsulta seleccionará la fecha de pedido más reciente que sea menos reciente que la fecha de pedido ya asociada a la fila. Observe cómo se utiliza la palabra clave AS para crear un alias de tabla de modo que se pueden comparar valores de la subconsulta con valores en la actual fila de la consulta principal.

  1. En la cuarta columna de la cuadrícula, en la fila Campo, escriba la siguiente expresión:
Intervalo: [Fecha de pedido]-[Fecha anterior]

Esta expresión calcula el intervalo entre cada fecha de pedido y la fecha de pedido anterior de ese producto, utilizando el valor de fecha anterior definido mediante una subconsulta.

  1. En el grupo Resultados de la ficha Diseño, haga clic en Ejecutar.
  1. La consulta se ejecuta y muestra una lista de nombres de productos, fechas de pedido, fechas de pedido anteriores y el intervalo entre las fechas de pedido. Los resultados se ordenan primero por Id de producto (en orden ascendente) y, a continuación, por Fecha de pedido (en orden descendente).
  2.  Nota   Dado que 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 vez de los identificadores de producto reales. Aunque esto cambia los valores que aparecen, no cambia el criterio de ordenación.

  1. Cierre la base de datos Northwind.

Volver al principio Volver al principio

Utilizar una subconsulta como criterio para un campo de consulta

Puede utilizar una subconsulta como criterio (criterios: condiciones que se especifican para limitar los registros que se incluyen en el conjunto de resultados de una consulta o un filtro.) de campo. Utilice una subconsulta como criterio de campo cuando desee utilizar los resultados de la subconsulta para limitar los valores mostrados por el campo.

Por ejemplo, supongamos que desea revisar una lista de pedidos procesados por empleados que no son representantes de ventas. Para generar esta lista, debe comparar el Id de empleado para cada pedido con una lista de identificadores de los empleados que no son representantes de ventas. Para crear esta lista y utilizarla como criterio de campo, utilice una subconsulta, tal y como se muestra en el siguiente procedimiento:

  1. Abra la base de datos Northwind 2007.accdb y habilite su contenido.
  2. Cierre el formulario de inicio de sesión.
  3. En el grupo Otros de la ficha Crear, haga clic en Diseño de consulta.
  1. En el cuadro de diálogo Mostrar tabla, en la ficha Tablas, haga doble clic en Pedidos y Empleados.
  2. Cierre el cuadro de diálogo Mostrar tabla.
  3. En la tabla Pedidos, haga doble clic en el campo Id de empleado, el campo Id de pedido y en 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 Cargo para agregarlo a la cuadrícula de diseño.
  4. Haga clic con el botón secundario del en la fila Criterios de la columna Id de empleado y, a continuación, haga clic en Zoom en el menú contextual.
  5. En el cuadro de diálogo Zoom, escriba o pegue la siguiente expresión:
IN (SELECT [Id] FROM [Empleados] 
WHERE [Cargo]<>'Representante de ventas')

Ésta es la subconsulta. Selecciona todos los identificadores de los empleados cuyo cargo no sea representante de ventas y proporciona ese conjunto de resultados a la consulta principal, que comprueba si hay identificadores de empleado de la tabla Pedidos en el conjunto de resultados.

  1. En el grupo Resultados de la ficha Diseño, haga clic en Ejecutar.

La consulta se ejecuta y los resultados muestran una lista de los pedidos procesados por los empleados que no son representantes de ventas.

Volver al principio Volver al principio

Palabras clave SQL comunes que se pueden utilizar con una subconsulta

Hay varias palabras clave SQL que se pueden utilizar con una subconsulta:

 Nota   Esta lista no es exhaustiva. Puede utilizar cualquier palabra clave SQL válida en una subconsulta, salvo palabras clave de definición de datos.

  • ALL    Utilice ALL en una cláusula WHERE para recuperar las filas que cumplen la condición cuando se comparan con cada fila devuelta por la subconsulta.

Por ejemplo, supongamos que está analizando datos de alumnos de una universidad. Los alumnos deben mantener un mínimo de nota media (GPA), que varía según la asignatura. Las asignaturas y las notas medias se almacenan en una tabla denominada Majors (Asignaturas) y la información relevante de los alumnos se almacena en una tabla denominada Student_Records (Registros_Alumnos).

Para ver una lista de las asignaturas (y sus notas medias mínimas) para las que cada alumno con esa asignatura supera la nota media mínima, puede usar la siguiente consulta:

SELECT [Asignatura], [Mín_GPA] 
FROM [Asignaturas]
WHERE [Mín_GPA] < ALL
(SELECT [GPA] FROM [Registros_Alumnos]
 WHERE [Registros_Alumnos].[Asignatura]=[Asignaturas].[Asignatura]);
  • ANY    Utilice ANY en una cláusula WHERE para recuperar las filas que cumplen la condición cuando se comparan con al menos una de las filas devueltas por la subconsulta.

Por ejemplo, supongamos que está analizando datos de alumnos de una universidad. Los alumnos deben mantener un mínimo de nota media (GPA), que varía según la asignatura. Las asignaturas y las notas medias se almacenan en una tabla denominada Majors (Asignaturas) y la información relevante de los alumnos se almacena en una tabla denominada Student_Records (Registros_Alumnos).

Para ver una lista de las asignaturas (y sus notas medias mínimas) para las que algún alumno con esa asignatura no alcanza la nota media mínima, puede usar la siguiente consulta:

SELECT [Asignatura], [Mín_GPA] 
FROM [Asignaturas]
WHERE [Mín_GPA] > ANY
(SELECT [GPA] FROM [Registros_Alumnos]
 WHERE [Registros_Alumnos].[Asignatura]=[Asignaturas].[Asignatura]);

 Nota   También puede utilizar la palabra clave SOME con el mismo propósito; la palabra clave SOME es sinónimo de ANY.

  • EXISTS    Utilice EXISTS en una cláusula WHERE para indicar que una subconsulta debe devolver al menos una fila. Asimismo, puede colocar NOT delante de EXISTS para indicar que una subconsulta no debe devolver ninguna fila.

Por ejemplo, la siguiente consulta devuelve una lista de los productos encontrados en al menos un pedido existente:

SELECT *
FROM [Productos]
WHERE EXISTS
(SELECT * FROM [Detalles de pedido]
 WHERE [Detalles de pedido].[Id de producto]=[Productos].[Id]);

Si utiliza NOT EXISTS, la consulta devuelve una lista de los productos no encontrados en al menos un pedido existente:

SELECT *
FROM [Productos]
WHERE NOT EXISTS
(SELECT * FROM [Detalles de pedido]
 WHERE [Detalles de pedido].[Id de producto]=[Productos].[Id]);
  • IN    Utilice IN en una cláusula WHERE para comprobar que un valor en la actual fila de la consulta principal es parte del conjunto devuelto por la subconsulta. Asimismo, puede colocar NOT delante de IN para comprobar que un valor en la actual fila de la consulta principal no es parte del conjunto devuelto por la subconsulta.

Por ejemplo, la siguiente consulta devuelve una lista de los pedidos (con fechas de pedido) procesados por los empleados que no son representantes de ventas:

SELECT [Id de pedido], [Fecha de pedido]
FROM [Pedidos]
WHERE [Id de empleado] IN
(SELECT [Id] FROM [Empleados]
 WHERE [Cargo]<>'Representante de ventas');

Si utiliza NOT IN, puede escribir la misma consulta de la siguiente manera:

SELECT [Id de pedido], [Fecha de pedido]
FROM [Pedidos]
WHERE [Id de empleado] NOT IN
(SELECT [Id] FROM [Empleados]
 WHERE [Cargo]='Representante de ventas');

Volver al principio Volver al principio

 
 
Corresponde a:
Access 2010