jueves, 14 de mayo de 2009

Implementar FULL OUTER JOIN en Access 2003

Hace unos días tuve la necesidad de realizar este proceso, pero lamentablemente me di cuenta que por medio de Access 2003 no era posible, al menos no de la forma simple que todos conocemos, así que tuve que empezar a buscar un nuevo modo de realizar esta operación para que diera el mismo resultado.

Para las personas que no conozcan el FULL OUTER JOIN, lo que hace es regresar todos los registros de dos tablas, aunque en estas no coincida ninguno. Para los valores no coincidentes se regresara un valor NULL.

Ejemplo.


Estamos uniendo la tabla de Clientes y la de Proveedores por medio del campo “País” al finalizar, el resultado del Full Outer Join será la tabla que lleva su nombre (ver imagen). Mostraremos únicamente los campos:


clientes.País, clientes.Cliente, proveedor.País, proveedor.Cliente

los campos X7YZ____1.X7 en el resultado corresponden a “clientes.País” y “clientes.Cliente”

Como primer paso debemos hallar los registros que coinciden en ambas tablas, tanto Clientes como Proveedores. Esto lo logramos haciendo un INNER JOIN:


SELECT cliente.País, cliente.Cliente, proveedor.País, proveedor.Cliente

FROM cliente INNER JOIN proveedor ON cliente.País = proveedor.País;


Ahora necesitamos aquellos registros en los cuales el país de clientes no coincida con los países de proveedores, para esto deberemos hacer un LEFT JOIN no olvides agregar la condición donde se esecifica el país como Nulo marcado con rojo:


SELECT cliente.País, cliente.Cliente, proveedor.País, proveedor.Cliente

FROM cliente LEFT JOIN proveedor ON cliente.País = proveedor.País

WHERE proveedor.País is Null;


Como tercer paso tenemos que encontrar aquellos registros donde no coincida el país de provee dores con el de clientes, lo que lograremos con un RIGHT JOIN no olvides agregar la condición donde se esecifica el país como Nulo marcado con rojo:


SELECT cliente.País, cliente.Cliente, proveedor.País, proveedor.Cliente FROM cliente RIGHT JOIN proveedor ON cliente.País = proveedor.País

WHERE Cliente.País Is Null;



Para finalizar deberemos unir las tres consultas en una misma por medio de la función “UNION ALL” cosa fácil, abajo dejo el código para este ejemplo:


SELECT cliente.País, cliente.Cliente, proveedor.País, proveedor.Cliente

FROM cliente INNER JOIN proveedor ON cliente.País = proveedor.País;

UNION ALL

SELECT cliente.País, cliente.Cliente, proveedor.País, proveedor.Cliente

FROM cliente LEFT JOIN proveedor ON cliente.País = proveedor.País

WHERE proveedor.País is Null;

UNION ALL

SELECT cliente.País, cliente.Cliente, proveedor.País, proveedor.Cliente

FROM cliente RIGHT JOIN proveedor ON cliente.País = proveedor.País

WHERE Cliente.País Is Null;


Al ejecutar esta consulta obtendremos el equivalente a un FULL OUTER JOIN implementado en Microsoft Office Access 2003.


1 comentarios:

Anónimo dijo...

Excelente post amigo, ya llevava algun tiempo buscando algo como esto, pasa, que en mi, empresa no trabajan otra cosa que no sea access entonces no hay nada mas potente asi que tenemos que aguantarnos.

Gracias y Saludos!
Giovanny