Compartir a través de


Realizar combinaciones mediante Access SQL

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.