Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
En un sistema de bases de datos relacionales como Access, a menudo es necesario extraer simultáneamente información de varias tablas. Esto se puede lograr mediante una instrucción JOIN de SQL, que permite recuperar registros de tablas que tienen relaciones definidas, ya sean uno a uno, uno a varios o varios a varios.
Combinaciones internas
INNER JOIN, también conocido como combinación equi, es el tipo de combinación más utilizado. Esta combinación se utiliza para recuperar filas de varias tablas comparando el valor de un campo que coincide entre las tablas. Los campos que se combinan deben tener tipos de datos similares, y no se pueden combinar los tipos de datos MEMO y OLEOBJECT.
Para generar una instrucción INNER JOIN, utilice las palabras clave INNER JOIN en la cláusula FROM de una instrucción SELECT.
Este ejemplo utiliza INNER JOIN para generar un conjunto de resultados de todos los clientes que tienen facturas, además de las fechas y las cantidades de aquellas.
SELECT [Last Name], InvoiceDate, Amount
FROM tblCustomers INNER JOIN tblInvoices
ON tblCustomers.CustomerID=tblInvoices.CustomerID
ORDER BY InvoiceDate
Tenga en cuenta que los nombres de tabla se dividen entre las palabras clave INNER JOIN y que la comparación relacional es después de la palabra clave ON . Para las comparaciones relacionales, también puede usar los <operadores , >, <=, >=, o <> y también puede usar la palabra clave BETWEEN . Tenga en cuenta también que los campos de identificación de ambas tablas se utilizan sólo en la comparación relacional; no forman parte del conjunto de resultados final.
Para calificar aún más la instrucción SELECT , puede usar una cláusula WHERE después de la comparación de combinación en la cláusula ON .
El ejemplo siguiente limita el conjunto de resultados para que incluya únicamente las facturas cuya fecha sea posterior a enero de 1998.
SELECT [Last Name], InvoiceDate, Amount
FROM tblCustomers INNER JOIN tblInvoices
ON tblCustomers.CustomerID=tblInvoices.CustomerID
WHERE tblInvoices.InvoiceDate > #01/01/1998#
ORDER BY InvoiceDate
Cuando debe combinar más de una tabla, puede anidar las cláusulas INNER JOIN . El ejemplo siguiente se basa en una instrucción SELECT anterior para crear el conjunto de resultados, pero también incluye la ciudad y el estado de los clientes agregando INNER JOIN para la tabla tblShipping.
SELECT [Last Name], InvoiceDate, Amount, City, State
FROM (tblCustomers INNER JOIN tblInvoices
ON tblCustomers.CustomerID=tblInvoices.CustomerID)
INNER JOIN tblShipping
ON tblCustomers.CustomerID=tblShipping.CustomerID
ORDER BY InvoiceDate
Tenga en cuenta que la primera cláusula JOIN está entre paréntesis para mantenerla separada lógicamente de la segunda cláusula JOIN . También es posible unir una tabla a sí misma mediante un alias para el segundo nombre de tabla en la cláusula FROM . Suponga que desea buscar los registros de todos los clientes que tienen los apellidos duplicados. Para ello, puede crear el alias "A" para la segunda tabla y comprobar los nombres que son diferentes.
SELECT tblCustomers.[Last Name],
tblCustomers.[First Name]
FROM tblCustomers INNER JOIN tblCustomers AS A
ON tblCustomers.[Last Name]=A.[Last Name]
WHERE tblCustomers.[First Name]<>A.[First Name]
ORDER BY tblCustomers.[Last Name]
Combinaciones externas
Outer Join se usa para recuperar registros de varias tablas y conservar los registros de una de las tablas, incluso si no hay ningún registro coincidente en la otra tabla. There are two types of OUTER JOINs that the Access database engine supports: LEFT OUTER JOINs and RIGHT OUTER JOINs.
Think of two tables that are beside each other, a table on the left and a table on the right. LEFT OUTER JOIN selecciona todas las filas de la tabla derecha que coinciden con los criterios de comparación relacional y también selecciona todas las filas de la tabla izquierda, incluso si no existe ninguna coincidencia en la tabla derecha. The RIGHT OUTER JOIN is simply the reverse of the LEFT OUTER JOIN; all rows in the right table are preserved instead.
Por ejemplo, suponga que desea determinar la cantidad total facturada a cada cliente, pero si alguno de ellos no tiene factura, desea mostrarlo presentando la palabra "NONE".
SELECT [Last Name] & ', ' & [First Name] AS Name,
IIF(Sum(Amount) IS NULL,'NONE',Sum(Amount)) AS Total
FROM tblCustomers LEFT OUTER JOIN tblInvoices
ON tblCustomers.CustomerID=tblInvoices.CustomerID
GROUP BY [Last Name] & ', ' & [First Name]
En la instrucción SQL anterior suceden varias cosas. La primera es el uso del operador de concatenación de cadenas "&". Este operador le permite combinar varios campos para formar una sola cadena. La segunda es la instrucción IIF inmediata, que comprueba si el total es nulo. Si es así, la instrucción devuelve la palabra "NONE". Si el total no es null, se devuelve el valor. La última es la cláusula OUTER JOIN. El uso de LEFT OUTER JOIN conserva las filas de la tabla izquierda para que vea a todos los clientes, incluso a los que no tienen facturas.
OUTER JOINs can be nested inside INNER JOINs in a multi-table join, but INNER JOINs cannot be nested inside OUTER JOINs.
Producto cartesiano
Un término que suele surgir a la hora de examinar las combinaciones es el producto cartesiano. Un producto cartesiano se define como "todas las combinaciones posibles de todas las filas de todas las tablas". Por ejemplo, si uniera dos tablas sin ningún tipo de calificación o tipo de combinación, obtendría un producto cartesiano.
SELECT *
FROM tblCustomers, tblInvoices
Esto no es conveniente, especialmente con las tablas que contienen cientos o miles de filas. Debería evitar la creación de productos cartesianos limitando siempre las combinaciones.
Operador UNION
Aunque el operador UNION , también conocido como consulta de unión, no es técnicamente una combinación, se incluye aquí porque implica combinar datos de varios orígenes de datos en un conjunto de resultados, que es similar a algunos tipos de combinaciones. El operador UNION se utiliza para unir datos de tablas, instrucciones SELECT o consultas, excluyendo las filas duplicadas. Ambos orígenes de datos deben tener el mismo número de campos, pero los campos no tienen que ser del mismo tipo de datos. Supongamos que tiene una tabla Employees que tiene la misma estructura que la tabla Customers y que desea crear una lista de nombres y direcciones de correo electrónico combinando ambas tablas.
SELECT [Last Name], [First Name], Email
FROM tblCustomers
UNION
SELECT [Last Name], [First Name], Email
FROM tblEmployees
Para recuperar todos los campos de ambas tablas, puede usar la palabra clave TABLE , como esta.
TABLE tblCustomers
UNION
TABLE tblEmployees
El operador UNION no mostrará registros que sean duplicados exactos en ambas tablas, pero esto se puede invalidar mediante el predicado ALL después de la palabra clave UNION , de la siguiente manera:
SELECT [Last Name], [First Name], Email
FROM tblCustomers
UNION ALL
SELECT [Last Name], [First Name], Email
FROM tblEmployees
Instrucción TRANSFORM
Aunque la instrucción TRANSFORM , también conocida como consulta crosstab, tampoco se considera técnicamente una combinación, se incluye aquí porque implica combinar datos de varios orígenes de datos en un conjunto de resultados, que es similar a algunos tipos de combinaciones.
Las instrucciones TRANSFORM se utilizan para calcular sumas, promedios, recuentos u otros tipos de totales globales en los registros. A continuación, muestran la información en un formato de cuadrículas u hojas de cálculo con los datos agrupados vertical (filas) y horizontalmente (columnas). El formulario general de una instrucción TRANSFORM es el siguiente.
TRANSFORM aggregating function
SELECT statement
PIVOT column heading field
Un escenario de ejemplo podría ser si desea crear una hoja de datos que muestre los totales de factura de cada cliente año a año. Los encabezados verticales serán los nombres de los clientes, y los horizontales serán los años. Puede modificar una instrucción SQL anterior para ajustarla a la instrucción TRANSFORM.
TRANSFORM
IIF(Sum([Amount]) IS NULL,'NONE',Sum([Amount]))
AS Total
SELECT [Last Name] & ', ' & [First Name] AS Name
FROM tblCustomers LEFT JOIN tblInvoices
ON tblCustomers.CustomerID=tblInvoices.CustomerID
GROUP BY [Last Name] & ', ' & [First Name]
PIVOT Format(InvoiceDate, 'yyyy')
IN ('1996','1997','1998','1999','2000')
Tenga en cuenta que la función de agregación es la función Sum , los encabezados verticales se encuentran en la cláusula GROUP BY de la instrucción SELECT y los encabezados horizontales vienen determinados por el campo que aparece después de la palabra clave PIVOT .
Soporte técnico y comentarios
¿Tiene preguntas o comentarios sobre VBA para Office o esta documentación? Vea Soporte técnico y comentarios sobre VBA para Office para obtener ayuda sobre las formas en las que puede recibir soporte técnico y enviar comentarios.