A veces, es posible que desee combinar registros de una tabla o consulta con registros de una o más tablas en un solo resultado. Eso es lo que hace una consulta de unión en Access.
Para comprender correctamente las consultas de unión, primero necesita familiarizarse con el diseño de consultas de selección básicas en Access. Para obtener más información sobre cómo diseñar consultas de selección, vea Crear una consulta de selección sencilla.
Estudiar un ejemplo práctico de consulta de unión
Si nunca ha creado una consulta de unión antes, puede serle útil estudiar primero un ejemplo de trabajo en la plantilla de Access de Northwind. Puede buscar la plantilla de ejemplo de Northwind en la página de introducción de Access seleccionando Archivo>nuevo. También puede descargar una copia directamente desde una plantilla de ejemplo de Northwind.
Después de que Access abra la base de datos de Northwind, cierre el cuadro de diálogo de inicio de sesión que aparece por primera vez y, después, expanda el panel de navegación. Seleccione la parte superior del panel de navegación y, después, seleccione Tipo de objeto para organizar todos los objetos de base de datos por tipo. Después, expanda el grupo Consultas y verá una consulta denominada Transacciones de productos.
Las consultas de unión pueden diferenciarse fácilmente de otros objetos de consulta porque tienen un icono especial que es similar a dos círculos entrelazados que representan un conjunto combinado a partir de dos conjuntos:
A diferencia de las consultas normales de selección y acción, las tablas no están relacionadas en una consulta de unión. Esto significa que no puede usar el diseñador gráfico de consultas de Access para crear o editar consultas de unión. Si abre una consulta de unión desde el panel de navegación, Access la abre y muestra los resultados en la vista Hoja de datos. En Vistas en la pestaña Inicio , observe que la vista Diseño no está disponible al trabajar con consultas de unión. Solo puede cambiar entre la vista Hoja de datos y la vista SQL.
Para continuar estudiando este ejemplo de consulta de unión, haga clicen >Vista SQLde vistas> de inicio para ver la SQL sintaxis que la define. En esta ilustración, hemos agregado espacio adicional en la SQL para que pueda ver fácilmente las distintas partes que conforman una consulta de unión.
Veamos en detalle la SQL sintaxis de esta consulta de unión de la base de datos de Northwind:
SELECT [Product ID], [Order Date], [Company Name], [Transaction], [Quantity]
FROM [Product Orders]
UNION
SELECT [Product ID], [Creation Date], [Company Name], [Transaction], [Quantity]
FROM [Product Purchases]
ORDER BY [Order Date] DESC;
Las partes primera y tercera de esta instrucción SQL son básicamente dos consultas de selección. Estas consultas recuperan dos conjuntos de registros: uno de la tabla Pedidos de producto y otro de la tabla Compras de producto.
La segunda parte de esta SQL instrucción es la UNION palabra clave, que indica a Access que combine estos dos conjuntos de registros.
La última parte de esta SQL declaración determina el orden de los registros combinados mediante una ORDER BY instrucción. En este ejemplo, Access ordena todos los registros por el campo Fecha de pedido en orden descendente.
Nota
Las consultas de unión siempre son de solo lectura en Access; no se pueden modificar los valores en la vista Hoja de datos.
Crear y combinar consultas de selección para crear una consulta de unión
Aunque puede crear una consulta de unión escribiendo la sintaxis directamente en la SQLvista SQL, es posible que le resulte más fácil crearla por partes con consultas de selección. Después, puede copiar y pegar las partes de la instrucción SQL en una consulta de unión combinada.
Si prefiere dejar de leer los pasos y ver un ejemplo en su lugar, vaya a la sección siguiente, Ver un ejemplo de creación de una consulta de unión.
- En el grupo Consultas de la pestaña Crear, haga clic en Diseño de la consulta.
- Haga doble clic en la tabla que contiene los campos que desea incluir. La tabla se agrega a la ventana de diseño de la consulta.
- En la ventana de diseño de la consulta, haga doble clic en cada uno de los campos que quiera incluir. Al seleccionar campos, procure agregar el mismo número de campos y en el mismo orden que a las otras consultas de selección. Preste especial atención a los tipos de datos de los campos y asegúrese de que son compatibles con los tipos de datos de los campos en la misma posición de las otras consultas que está combinando. Por ejemplo, si la primera consulta de selección tiene cinco campos y el primer campo contiene datos de fecha y hora, asegúrese de que las demás consultas de selección que está combinando también tienen cinco campos y que el primero contiene datos de fecha y hora, y así sucesivamente.
- También puede agregar criterios a los campos si escribe las expresiones correspondientes en la fila Criterios de la cuadrícula de campos.
- Cuando haya acabado de agregar campos y criterios de campo, debe ejecutar la consulta de selección y revisar su resultado. En la pestaña Diseño, en el grupo Resultados, haga clic en Ejecutar.
- Cambie la consulta a la vista Diseño.
- Guarde la consulta de selección y déjela abierta.
- Repita este procedimiento para cada una de las consultas de selección que desee combinar.
Ahora que ha creado las consultas de selección, es el momento de combinarlas. En este paso, creará la consulta de unión copiando y pegando las SQL instrucciones.
- En el grupo Consultas de la pestaña Crear, haga clic en Diseño de la consulta.
- En la pestaña Diseño, en el grupo Consulta, haga clic en Unión. Access oculta la ventana de diseño de la consulta y muestra la pestaña del objeto vista SQL . En este momento, la pestaña está vacía.
- Haga clic en la pestaña de la primera consulta de selección que desee combinar en la consulta de unión.
- En la pestaña Inicio , haga clic en Ver>vista SQL.
- Copie la
SQLinstrucción de la consulta de selección. Haga clic en la pestaña de la consulta de unión que empezó a crear anteriormente. - Pegue la
SQLinstrucción de la consulta de selección en la pestaña del objeto vista SQL de la consulta de unión. - Elimine el punto y coma (
;) al final de la instrucción de consultaSQLde selección. - Presione Entrar para mover el cursor una línea hacia abajo y, después, escriba
UNIONen la nueva línea. - Haga clic en la pestaña de la siguiente consulta de selección que desee combinar en la consulta de unión.
- Repita los pasos del 5 al 10 hasta que haya copiado y pegado todas las
SQLinstrucciones de las consultas de selección en la ventana de la vista SQL de la consulta de unión. No elimine el punto y coma ni escriba nada después de laSQLinstrucción de la última consulta de selección. - En el grupo Resultados de la pestaña Diseño, haga clic en Ejecutar.
Los resultados de la consulta de unión se mostrarán en la vista Hoja de datos.
Ver un ejemplo de creación de una consulta de unión
Este es un ejemplo que puede volver a crear en la base de datos de ejemplo de Northwind. Esta consulta de unión recopila los nombres de personas de la tabla Clientes y los combina con los nombres de persona de la tabla Proveedores. Si prefiere seguir los pasos, trabaje con la copia de la base de datos de ejemplo de Northwind.
Estos son los pasos necesarios para crear este ejemplo:
Cree dos consultas de selección llamadas Consulta1 y Consulta2, con las tablas Clientes y Proveedores respectivamente como orígenes de datos. Use los campos Nombre y Apellidos como los valores para mostrar.
Cree una consulta llamada Consulta3 sin un origen de datos inicialmente y, después, haga clic en el comando Unión de la pestaña Diseño para convertir esta consulta en una consulta de unión.
Copie y pegue las instrucciones SQL de Consulta1 y Consulta2 en Consulta3. Asegúrese de quitar el punto y coma adicional y de agregar la
UNIONpalabra clave. Después, puede comprobar los resultados en la vista Hoja de datos.Agregue una cláusula de ordenación a una de las consultas y, a continuación, pegue la
ORDER BYinstrucción en la consulta de unión en la vista SQL. Tenga en cuenta que, en la consulta de unión Consulta3, justo antes de anexar el pedido, primero se eliminan los signos de punto y coma y, después, el nombre de tabla de los nombres de campo.El final
SQLque combina y ordena los nombres de este ejemplo de consulta de unión es el siguiente:SELECT Customers.Company, Customers.[Last Name], Customers.[First Name] FROM Customers UNION SELECT Suppliers.Company, Suppliers.[Last Name], Suppliers.[First Name] FROM Suppliers ORDER BY [Last Name], [First Name];
Si se siente muy cómodo escribiendo SQL sintaxis, puede escribir su propia SQL instrucción para la consulta de unión directamente en la vista SQL. Pero puede que le resulte útil seguir el método de copiar y pegar instrucciones SQL de otros objetos de consulta. Cada consulta puede ser mucho más complicada que los ejemplos sencillos de consulta de selección usados aquí. Le recomendamos que cree y pruebe cada consulta detenidamente antes de combinarlas en la consulta de unión. Si la consulta de unión no puede ejecutarse, puede ajustar cada consulta de forma individual hasta que se complete correctamente y, después, vuelva a crear la consulta de unión con la sintaxis corregida.
Revise el resto de las secciones de este artículo para obtener más consejos y sugerencias sobre el uso de consultas de unión.
Combinar tres o más tablas o consultas en una consulta de unión
En el ejemplo de la sección anterior que usa la base de datos de Northwind, se combinan datos de solo dos tablas. Pero se pueden combinar tres o más tablas fácilmente con una consulta de unión. Por ejemplo, basándonos en el ejemplo anterior, puede que también quiera incluir los nombres de los empleados en el resultado de la consulta. Para completar esa tarea, puede agregar una tercera consulta y combinarla con la instrucción SQL anterior con una palabra clave adicional de UNION, como en el ejemplo siguiente:
SELECT Customers.Company, Customers.[Last Name], Customers.[First Name]
FROM Customers
UNION
SELECT Suppliers.Company, Suppliers.[Last Name], Suppliers.[First Name]
FROM Suppliers
UNION
SELECT Employees.Company, Employees.[Last Name], Employees.[First Name]
FROM Employees
ORDER BY [Last Name], [First Name];
Cuando vea el resultado en la vista Hoja de datos, todos los empleados se mostrarán con el nombre de la compañía de ejemplo, lo que probablemente no sea muy útil. Si quiere que ese campo muestre si una persona es un empleado interno, un proveedor o un cliente, puede incluir un valor fijo en lugar del nombre de la compañía. Este es el SQL aspecto que tiene:
SELECT "Customer" As Employment, Customers.[Last Name], Customers.[First Name]
FROM Customers
UNION
SELECT "Supplier" As Employment, Suppliers.[Last Name], Suppliers.[First Name]
FROM Suppliers
UNION
SELECT "In-house" As Employment, Employees.[Last Name], Employees.[First Name]
FROM Employees
ORDER BY [Last Name], [First Name];
Así se mostrarían los resultados en la vista Hoja de datos. Access mostrará estos cinco registros de ejemplo:
| Empleo | Apellido | Nombre |
|---|---|---|
| Interno | García | Julia |
| Interno | Fuentes | Verónica |
| Proveedor | Valladares | Sergio |
| Cliente | Valentín | Pelayo |
| Cliente | Armijo | Pedro |
Puede reducir la consulta aún más porque Access solo lee los nombres de los campos de salida de la primera consulta de una consulta de unión. Aquí, se quita el resultado de la segunda y tercera sección de consulta:
SELECT "Customer" As Employment, [Last Name], [First Name]
FROM Customers
UNION
SELECT "Supplier", [Last Name], [First Name]
FROM Suppliers
UNION
SELECT "In-house", [Last Name], [First Name]
FROM Employees
ORDER BY [Last Name], [First Name];
Filtrado en consultas de unión
En una consulta de unión de Access, solo se permite ordenar una vez, pero puede filtrar cada consulta por separado. Basándonos en la consulta de unión de la sección anterior, aquí tiene un ejemplo que filtra cada consulta agregando una WHERE cláusula.
SELECT "Customer" As Employment, Customers.[Last Name], Customers.[First Name]
FROM Customers
WHERE [State/Province] = "UT"
UNION
SELECT "Supplier", [Last Name], [First Name]
FROM Suppliers
WHERE [Job Title] = "Sales Manager"
UNION
SELECT "In-house", Employees.[Last Name], Employees.[First Name]
FROM Employees
WHERE City = "Seattle"
ORDER BY [Last Name], [First Name];
Si cambia a la vista Hoja de datos, verá resultados similares a estos:
| Empleo | Apellido | Nombre |
|---|---|---|
| Proveedor | Arellano | Alejandra |
| Interno | García | Julia |
| Cliente | Hermosilla | Alberto |
| Interno | Martínez | Lucía |
| Proveedor | Melgar | Beatriz |
| Cliente | Amaraz | Álvaro |
| Proveedor | Castellanos | Bartolomé |
| Proveedor | Gil | Luis |
| Interno | Torres | Esteban |
| Proveedor | Olivares | Claudia |
| Interno | Gómez | Roberto |
Combinar tipos de datos
Si las consultas que uniona son muy diferentes, es posible que se encuentre con una situación en la que un campo de salida debe combinar datos de tipos de datos diferentes. En ese caso, la consulta de unión devolverá con frecuencia los resultados como un tipo de datos de texto, ya que el tipo de datos admite texto y números.
Para comprender cómo funciona esto, usaremos la consulta de unión Transacciones de productos en la base de datos de ejemplo de Northwind. Abra la base de datos de ejemplo y, después, abra la consulta Transacciones de productos en la vista Hoja de datos. Los últimos diez registros serán similares a este resultado:
| Identificador del producto | Fecha del pedido | Nombre de la compañía | Transacción | Cantidad |
|---|---|---|---|---|
| 77 | 22/01/2006 | Proveedor B | Compra | 60 |
| 80 | 22/01/2006 | Proveedor D | Compra | 75 |
| 81 | 22/01/2006 | Proveedor A | Compra | 125 |
| 81 | 22/01/2006 | Proveedor A | Compra | 200 |
| 7 | 20/01/2006 | Compañía D | Venta | 10 |
| 51 | 20/01/2006 | Compañía D | Venta | 10 |
| 80 | 20/01/2006 | Compañía D | Venta | 10 |
| 34 | 15/01/2006 | Compañía AA | Venta | 100 |
| 80 | 15/01/2006 | Compañía AA | Venta | 30 |
Supongamos que desea dividir el campo Cantidad en dos campos: Comprar y Vender. Supongamos también que desea un valor cero fijo para el campo sin valor. Este es el SQL aspecto de esta consulta de unión:
SELECT [Product ID], [Order Date], [Company Name], [Transaction], 0 As Buy, [Quantity] As Sell
FROM [Product Orders]
UNION
SELECT [Product ID], [Creation Date], [Company Name], [Transaction], [Quantity] As Buy, 0 As Sell
FROM [Product Purchases]
ORDER BY [Order Date] DESC;
Si cambia a la vista Hoja de datos, verá que los últimos diez registros ahora se muestran de esta forma:
| Identificador del producto | Fecha del pedido | Nombre de la compañía | Transacción | Comprar | Vender |
|---|---|---|---|---|---|
| 74 | 22/01/2006 | Proveedor B | Compra | 20 | 0 |
| 77 | 22/01/2006 | Proveedor B | Compra | 60 | 0 |
| 80 | 22/01/2006 | Proveedor D | Compra | 75 | 0 |
| 81 | 22/01/2006 | Proveedor A | Compra | 125 | 0 |
| 81 | 22/01/2006 | Proveedor A | Compra | 200 | 0 |
| 7 | 20/01/2006 | Compañía D | Venta | 0 | 10 |
| 51 | 20/01/2006 | Compañía D | Venta | 0 | 10 |
| 80 | 20/01/2006 | Compañía D | Venta | 0 | 10 |
| 34 | 15/01/2006 | Compañía AA | Venta | 0 | 100 |
| 80 | 15/01/2006 | Compañía AA | Venta | 0 | 30 |
Continuando con este ejemplo, ¿qué ocurre si quiere que los campos con valores cero estén vacíos? Puede modificar el SQL para mostrar nada en lugar de cero agregando la Null palabra clave, como se muestra aquí:
SELECT [Product ID], [Order Date], [Company Name], [Transaction], Null As Buy, [Quantity] As Sell
FROM [Product Orders]
UNION
SELECT [Product ID], [Creation Date], [Company Name], [Transaction], [Quantity] As Buy, Null As Sell
FROM [Product Purchases]
ORDER BY [Order Date] DESC;
Pero, como puede que comprobara al cambiar a la vista Hoja de datos, se produjo un resultado inesperado. En la columna Comprar, se borraron todos los campos:
| Identificador del producto | Fecha del pedido | Nombre de la compañía | Transacción | Comprar | Vender |
|---|---|---|---|---|---|
| 74 | 22/01/2006 | Proveedor B | Compra | ||
| 77 | 22/01/2006 | Proveedor B | Compra | ||
| 80 | 22/01/2006 | Proveedor D | Compra | ||
| 81 | 22/01/2006 | Proveedor A | Compra | ||
| 81 | 22/01/2006 | Proveedor A | Compra | ||
| 7 | 20/01/2006 | Compañía D | Venta | 10 | |
| 51 | 20/01/2006 | Compañía D | Venta | 10 | |
| 80 | 20/01/2006 | Compañía D | Venta | 10 | |
| 34 | 15/01/2006 | Compañía AA | Venta | 100 | |
| 80 | 15/01/2006 | Compañía AA | Venta | 30 |
Esto ocurre porque Access determina los tipos de datos de los campos a partir de la primera consulta. En este ejemplo, NULL no es un número.
Entonces, ¿qué sucede si intenta insertar una cadena vacía para el valor en blanco de los campos? El SQL aspecto de este intento podría ser similar al siguiente:
SELECT [Product ID], [Order Date], [Company Name], [Transaction], "" As Buy, [Quantity] As Sell
FROM [Product Orders]
UNION
SELECT [Product ID], [Creation Date], [Company Name], [Transaction], [Quantity] As Buy, "" As Sell
FROM [Product Purchases]
ORDER BY [Order Date] DESC;
Al cambiar a la vista Hoja de datos, verá que Access recupera los valores de Comprar, pero convirtió los valores en texto. Verá que son valores de texto porque están alineados a la izquierda en la vista Hoja de datos. La cadena vacía de la primera consulta no es un número y, por este motivo, verá estos resultados. También puede que se diera cuenta de que los valores de Vender también se convirtieron en texto porque los registros de compra contienen una cadena vacía.
| Identificador del producto | Fecha del pedido | Nombre de la compañía | Transacción | Comprar | Vender |
|---|---|---|---|---|---|
| 74 | 22/01/2006 | Proveedor B | Compra | 20 | |
| 77 | 22/01/2006 | Proveedor B | Compra | 60 | |
| 80 | 22/01/2006 | Proveedor D | Compra | 75 | |
| 81 | 22/01/2006 | Proveedor A | Compra | 125 | |
| 81 | 22/01/2006 | Proveedor A | Compra | 200 | |
| 7 | 20/01/2006 | Compañía D | Venta | 10 | |
| 51 | 20/01/2006 | Compañía D | Venta | 10 | |
| 80 | 20/01/2006 | Compañía D | Venta | 10 | |
| 34 | 15/01/2006 | Compañía AA | Venta | 100 | |
| 80 | 15/01/2006 | Compañía AA | Venta | 30 |
Entonces, ¿cómo puedo solucionar esto?
Una solución es forzar que la consulta espere un número en el valor del campo. Puede hacerlo con esta expresión:
IIf(False, 0, Null)
La condición para comprobar, False, nunca es True, por lo que la expresión siempre devuelve Null. Sin embargo, Access sigue evaluando ambas opciones de salida y trata la salida como numérica o Null.
Siga estos pasos para usar esta expresión en nuestro ejemplo práctico:
SELECT [Product ID], [Order Date], [Company Name], [Transaction], IIf(False, 0, Null) As Buy, [Quantity] As Sell
FROM [Product Orders]
UNION
SELECT [Product ID], [Creation Date], [Company Name], [Transaction], [Quantity] As Buy, Null As Sell
FROM [Product Purchases]
ORDER BY [Order Date] DESC;
No es necesario modificar la segunda consulta.
Si cambia a la vista Hoja de datos, ahora verá el resultado esperado:
| Identificador del producto | Fecha del pedido | Nombre de la compañía | Transacción | Comprar | Vender |
|---|---|---|---|---|---|
| 74 | 22/01/2006 | Proveedor B | Compra | 20 | |
| 77 | 22/01/2006 | Proveedor B | Compra | 60 | |
| 80 | 22/01/2006 | Proveedor D | Compra | 75 | |
| 81 | 22/01/2006 | Proveedor A | Compra | 125 | |
| 81 | 22/01/2006 | Proveedor A | Compra | 200 | |
| 7 | 20/01/2006 | Compañía D | Venta | 10 | |
| 51 | 20/01/2006 | Compañía D | Venta | 10 | |
| 80 | 20/01/2006 | Compañía D | Venta | 10 | |
| 34 | 15/01/2006 | Compañía AA | Venta | 100 | |
| 80 | 15/01/2006 | Compañía AA | Venta | 30 |
Otro método para obtener el mismo resultado es anteponer las consultas en la consulta de unión con otra consulta:
SELECT
0 As [Product ID], Date() As [Order Date],
"" As [Company Name], "" As [Transaction],
0 As Buy, 0 As Sell
FROM [Product Orders]
WHERE False
Por cada campo, Access devuelve valores fijos del tipo de datos que defina. Está claro que no quiere que el resultado de esta consulta interfiera con los resultados, por lo que el truco para evitar esto es incluir una cláusula WHERE en False:
WHERE False
Este es un pequeño truco. Dado que la condición es siempre falsa, la consulta no devuelve nada. Al combinar esta instrucción con la instrucción SQL existente, llegamos a la siguiente instrucción completada:
SELECT
0 As [Product ID], Date() As [Order Date],
"" As [Company Name], "" As [Transaction],
0 As Buy, 0 As Sell
FROM [Product Orders]
WHERE False
UNION
SELECT [Product ID], [Order Date], [Company Name], [Transaction], Null As Buy, [Quantity] As Sell
FROM [Product Orders]
UNION
SELECT [Product ID], [Creation Date], [Company Name], [Transaction], [Quantity] As Buy, Null As Sell
FROM [Product Purchases]
ORDER BY [Order Date] DESC;
Nota
En este ejemplo, la consulta combinada en la base de datos de Northwind devuelve 100 registros, mientras que las dos consultas individuales devuelven 58 y 43 registros para un total de 101 registros. Esta diferencia se produce porque dos registros no son únicos. Vea Trabajar con registros distintos en consultas de unión con UNION ALL para obtener información sobre cómo solucionar este escenario con UNION ALL.
Agregar totales en una consulta de unión
Un uso especial para una consulta de unión es combinar un conjunto de registros con un registro que contiene la suma de uno o más campos.
Este es otro ejemplo que puede crear en la base de datos de ejemplo de Northwind para mostrar cómo obtener un total en una consulta de unión.
Cree una consulta sencilla para ver la compra de cervezas (id. de producto=34 en la base de datos de Northwind) con la siguiente sintaxis SQL:
SELECT [Purchase Order Details].[Date Received], [Purchase Order Details].Quantity FROM [Purchase Order Details] WHERE ((([Purchase Order Details].[Product ID])=34)) ORDER BY [Purchase Order Details].[Date Received];Si cambia a la vista Hoja de datos, verá cuatro compras:
Fecha de recepción Cantidad 22/01/2006 100 22/01/2006 60 04/04/2006 50 05/04/2006 300 Para obtener el total, cree una consulta de agregación sencilla con la siguiente instrucción SQL:
SELECT Max([Date Received]), Sum([Quantity]) AS SumOfQuantity FROM [Purchase Order Details] WHERE ((([Purchase Order Details].[Product ID])=34))Si cambia a la vista Hoja de datos, solo verá un registro:
MáxDeFecha recibido SumaDeCantidad 05/04/2006 510 Combine estas dos consultas en una consulta de unión para anexar el registro con la cantidad total a los registros de compra:
SELECT [Purchase Order Details].[Date Received], [Purchase Order Details].Quantity FROM [Purchase Order Details] WHERE ((([Purchase Order Details].[Product ID])=34)) UNION SELECT Max([Date Received]), Sum([Quantity]) AS SumOfQuantity FROM [Purchase Order Details] WHERE ((([Purchase Order Details].[Product ID])=34)) ORDER BY [Purchase Order Details].[Date Received];Si cambia a la vista Hoja de datos, verá las cuatro compras con la suma de cada una seguida por un registro con la cantidad total:
Fecha de recepción Cantidad 22/01/2006 60 22/01/2006 100 04/04/2006 50 05/04/2006 300 05/04/2006 510
Con esto, completamos los conceptos básicos de cómo agregar totales en una consulta de unión. Es posible que también desee incluir valores fijos en ambas consultas como "Detalle" y "Total" para separar visualmente el registro total de los demás registros. Para obtener información sobre cómo usar valores fijos, vea la sección Combinar tres o más tablas o consultas en una consulta de unión.
Trabajar con distintos registros en consultas de unión con UNION ALL
De forma predeterminada, en las consultas de unión de Access, solo se incluyen registros distintos. Pero ¿y si quiere incluir todos los registros? Aquí le podría resultar útil otro ejemplo.
En la sección anterior, le mostramos cómo crear un total en una consulta de unión. Modifique esa consulta SQL de unión para que incluya Product ID = 48:
SELECT [Purchase Order Details].[Date Received], [Purchase Order Details].Quantity
FROM [Purchase Order Details]
WHERE ((([Purchase Order Details].[Product ID])=48))
UNION
SELECT Max([Date Received]), Sum([Quantity]) AS SumOfQuantity
FROM [Purchase Order Details]
WHERE ((([Purchase Order Details].[Product ID])=48))
ORDER BY [Purchase Order Details].[Date Received];
Si cambia a la vista Hoja de datos, verá un resultado que puede resultar confuso:
| Fecha de recepción | Cantidad |
|---|---|
| 22/01/2006 | 100 |
| 22/01/2006 | 200 |
Por supuesto, un registro no devuelve el doble de la cantidad total.
Verá este resultado porque, en un día, se vendió dos veces la misma cantidad de chocolates, como se registra en la tabla Detalles de pedido de compra. Este es el resultado de una consulta de selección sencilla donde se muestran los dos registros en la base de datos de ejemplo de Northwind:
| Id. de pedido de compra | Producto | Cantidad |
|---|---|---|
| 100 | Chocolate de Northwind Traders | 100 |
| 92 | Chocolate de Northwind Traders | 100 |
En la consulta de unión indicada anteriormente, puede ver que el campo Id. de pedido de compra no está incluido y que los dos campos no componen dos registros distintos.
Si desea incluir todos los registros, use UNION ALL en lugar de UNION en SQLel . Es muy probable que esto afecte a la ordenación de los resultados, por lo que es posible que también desee incluir una ORDER BY cláusula para determinar un criterio de ordenación. Esta es la modificación SQL basada en el ejemplo anterior:
SELECT [Purchase Order Details].[Date Received], Null As [Total], [Purchase Order Details].Quantity
FROM [Purchase Order Details]
WHERE ((([Purchase Order Details].[Product ID])=48))
UNION ALL
SELECT Max([Date Received]), "Total" As [Total], Sum([Quantity]) AS SumOfQuantity
FROM [Purchase Order Details]
WHERE ((([Purchase Order Details].[Product ID])=48))
ORDER BY [Total];
Si cambia a la vista Hoja de datos, verá todos los detalles, además de un total como el último registro:
| Fecha de recepción | Total | Cantidad |
|---|---|---|
| 22/01/2006 | 100 | |
| 22/01/2006 | 100 | |
| 22/01/2006 | Total | 200 |
Usar una consulta de unión para filtrar registros en un formulario mediante un control de cuadro combinado
Las consultas de unión suelen usarse como el origen de registros de un control de cuadro combinado en un formulario. Puede usar ese cuadro combinado para seleccionar un valor con el que filtrar los registros del formulario. Por ejemplo, puede filtrar los registros de empleados por ciudad.
Para poner esto en práctica, aquí tiene otro ejemplo que puede crear en la base de datos de ejemplo de Northwind para ilustrar este escenario.
Cree una consulta de selección sencilla con esta
SQLsintaxis:SELECT Employees.City, Employees.City AS Filter FROM Employees;Si cambia a la vista Hoja de datos, verá los siguientes resultados:
Ciudad Filtrar Seattle Seattle Bellevue Bellevue Redmond Redmond Kirkland Kirkland Seattle Seattle Redmond Redmond Seattle Seattle Redmond Redmond Seattle Seattle Al comprobar los resultados, puede que no le resulten muy útiles. Expanda la consulta, sin embargo, y con transforme en una consulta de unión mediante el siguiente:
SQLSELECT Employees.City, Employees.City AS Filter FROM Employees UNION SELECT "<All>", "*" AS Filter FROM Employees ORDER BY City;Si cambia a la vista Hoja de datos, verá los siguientes resultados:
Ciudad Filtrar <Todo> * Bellevue Bellevue Kirkland Kirkland Redmond Redmond Seattle Seattle Access realiza una unión de los nueve registros mostrados anteriormente con los valores de <campo fijo Todos> y "*". Dado que esta cláusula de unión no contiene
UNION ALL, Access solo devuelve registros distintos. Esto significa que cada ciudad se devuelve solo una vez con valores idénticos fijos.Después de completar una consulta de unión donde se muestra una sola vez cada nombre de ciudad, además de una opción que selecciona todas las ciudades, puede usar esta consulta como el origen de registros para un cuadro combinado en un formulario. Si usa este ejemplo específico como un modelo, puede crear un control de cuadro combinado en un formulario, establecer esta consulta como el origen de registros, establecer la propiedad “Ancho de columna” de la columna Filtro en 0 (cero) para ocultarla visualmente y, después, establecer la propiedad “Columna enlazada” en 1 para indicar el índice de la segunda columna. En la
Filterpropiedad del formulario en sí, puede agregar código como el siguiente para activar un filtro de formulario mediante el valor seleccionado en el control de cuadro combinado:Me.Filter = "[City] Like '" & Me![FilterComboBoxName].Value & "'" Me.FilterOn = TrueA continuación, el usuario del formulario puede filtrar los registros del formulario por un nombre de ciudad específico o seleccionar <Todos> para enumerar todos los registros de todas las ciudades.