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 <token>TE000126768</token>.

Puede escribir una subconsulta en una <token>TE000127167</token> o una instrucción SQL (Lenguaje de consulta estructurado) en la <token>TE000126761</token>.

En este artí­culo

<link xlink:href="a8532322-e42f-4f94-bc38-ace7c182916a#bm1">Utilizar los resultados de una consulta como campo de otra consulta</link>

<link xlink:href="a8532322-e42f-4f94-bc38-ace7c182916a#bm2">Utilizar una subconsulta como criterio para un campo de consulta</link>

<link xlink:href="a8532322-e42f-4f94-bc38-ace7c182916a#bm3">Palabras clave SQL comunes que se pueden utilizar con una subconsulta</link>

Utilizar los resultados de una consulta como campo de otra consulta

Puede utilizar una subconsulta como un alias 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.

  1. En la pestaña <ui>Archivo</ui>, haga clic en <ui>Nuevo</ui>.

  2. En <ui>Plantillas disponibles</ui>, haga clic en <ui>Plantillas de ejemplo</ui>.

  3. Haga clic en <ui>Neptuno</ui> y, después, en <ui>Crear</ui>.

  4. Siga las instrucciones que aparecen en la página <ui>Northwind Traders</ui> (en la pestaña de objeto <ui>Pantalla de inicio</ui>) para abrir la base de datos y, a continuación, cierre la ventana Cuadro de diálogo de inicio de sesión.

  5. En el grupo <ui>Consultas</ui> de la pestaña <ui>Crear</ui>, haga clic en <ui>Diseño de consulta</ui>.

  6. En el cuadro de diálogo <ui>Mostrar tabla</ui>, haga clic en la pestaña <ui>Consultas</ui> y, a continuación, haga doble clic en <ui>Pedidos de productos</ui>.

  7. Cierre el cuadro de diálogo <ui>Mostrar tabla</ui>.

  8. Haga doble clic en el campo <ui>Id. de producto</ui> y el campo <ui>Fecha de pedido</ui> para agregarlos a la cuadrícula de diseño de la consulta.

  9. En la fila <ui>Orden</ui> de la columna <ui>Id. de producto</ui> de la cuadrícula, seleccione <ui>Ascendente</ui>.

  10. En la fila <ui>Orden</ui> de la columna <ui>Fecha de pedido</ui> de la cuadrícula, seleccione <ui>Descendente</ui>.

  11. En la tercera columna de la cuadrícula, haga clic con el botón secundario en la fila <ui>Campo</ui> y, a continuación, haga clic en <ui>Zoom</ui> en el menú contextual.

  12. En el cuadro de diálogo <ui>Zoom</ui>, 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 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.

  13. En la cuarta columna de la cuadrícula, en la fila <ui>Campo</ui>, escriba la siguiente expresión:

    <codeInline>Interval: [Order Date]-[Prior Date]</codeInline>

    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.<br />

  14. En el grupo <ui>Resultados</ui> de la pestaña <ui>Diseño</ui>, haga clic en <ui>Ejecutar</ui>.

    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.

  15. Cierre la base de datos Northwind.

<link xlink:href="a8532322-e42f-4f94-bc38-ace7c182916a#__top">Principio de página</link>

Utilizar una subconsulta como criterio para un campo de consulta

Puede utilizar una subconsulta como criterio 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 <legacyItalic>no</legacyItalic> 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 Northwind.accdb y habilite su contenido.

  2. Cierre el formulario de inicio de sesión.

  3. En la ficha <ui>Crear</ui>, en el grupo <ui>Otros</ui>, haga clic en <ui>Diseño de la consulta</ui>.

  4. En el cuadro de diálogo <ui>Mostrar tabla</ui>, en la pestaña <ui>Tablas</ui>, haga doble clic en <ui>Pedidos</ui> y <ui>Empleados</ui>.

  5. Cierre el cuadro de diálogo <ui>Mostrar tabla</ui>.

  6. En la tabla Pedidos, haga doble clic en el campo <ui>Id de empleado</ui>, el campo <ui>Id. de pedido</ui> y en el campo <ui>Fecha de pedido</ui> para agregarlos a la cuadrícula de diseño de la consulta. En la tabla Empleados, haga doble clic en el campo <ui>Cargo</ui> para agregarlo a la cuadrícula de diseño.

  7. Haga clic con el botón secundario del en la fila <ui>Criterios</ui> de la columna Id de empleado y, a continuación, haga clic en <ui>Zoom</ui> en el menú contextual.

  8. En el cuadro de diálogo <ui>Zoom</ui>, escriba o pegue la siguiente expresión:

    IN (SELECT [ID] FROM [Employees] 
    WHERE [Job Title]<>'Sales Representative')

    Esta 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.

  9. En la pestaña <ui>Diseño</ui>, en el grupo <ui>Resultados</ui>, haga clic en <ui>Ejecutar</ui>.

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

<link xlink:href="a8532322-e42f-4f94-bc38-ace7c182916a#__top">Principio de página</link>

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.

  • <embeddedLabel>ALL</embeddedLabel> 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 [Major], [Min_GPA] 
    FROM [Majors]
    WHERE [Min_GPA] < ALL
    (SELECT [GPA] FROM [Student_Records]
    WHERE [Student_Records].[Major]=[Majors].[Major]);
  • <embeddedLabel>ANY</embeddedLabel> 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 [Major], [Min_GPA] 
    FROM [Majors]
    WHERE [Min_GPA] > ANY
    (SELECT [GPA] FROM [Student_Records]
    WHERE [Student_Records].[Major]=[Majors].[Major]);

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

  • <embeddedLabel>EXISTS</embeddedLabel> 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 [Products]
    WHERE EXISTS
    (SELECT * FROM [Order Details]
    WHERE [Order Details].[Product ID]=[Products].[ID]);

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

    SELECT *
    FROM [Products]
    WHERE NOT EXISTS
    (SELECT * FROM [Order Details]
    WHERE [Order Details].[Product ID]=[Products].[ID]);
  • <embeddedLabel>IN</embeddedLabel> 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 [Order ID], [Order Date]
    FROM [Orders]
    WHERE [Employee ID] IN
    (SELECT [ID] FROM [Employees]
    WHERE [Job Title]<>'Sales Representative');

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

    SELECT [Order ID], [Order Date]
    FROM [Orders]
    WHERE [Employee ID] NOT IN
    (SELECT [ID] FROM [Employees]
    WHERE [Job Title]='Sales Representative');

<link xlink:href="a8532322-e42f-4f94-bc38-ace7c182916a#__top">Principio de página</link>

Ampliar sus conocimientos de Office
Explorar los cursos
Obtener nuevas características primero
Únase a los participantes de Office Insider

¿Le ha sido útil esta información?

¡Gracias por sus comentarios!

Gracias por sus comentarios. Quizá le interese ponerse en contacto con uno de nuestros agentes de soporte de Office.

×