martes, 1 de julio de 2008

FULL JOIN EN ACCESS


Del tutorial de sql de Claudio Casares (http://personal.lobocom.es/claudio/sql008.htm) : "... Full Join ... Este tipo de operador se utiliza para devolver todas las filas de una combinación tengan o no correspondencia. Es el equivalente a la utilización de LEFT JOIN y RIGHT JOIN a la misma vez ..."

Lamentablemente no disponemos de este operador en Access. Sin embargo, podemos emular su comportamiento :

-- Supongamos una tabla Autores ...
Create Table Autores (Id Int Primary Key, Nombre Text (255));
Insert Into Autores Values (1, "Ludwig Van Beethoven");
Insert Into Autores Values (2, "Wolfgang Amadeus Mozart");
Insert Into Autores Values (3, "Richard Strauss");
Insert Into Autores Values (4, "Gioachino Rossini");
Insert Into Autores Values (5, "Arrigo Boito");

-- Y una tabla de Operas ...Create Table Operas (Id Int Primary Key, Título text (255), Autor Int);
Insert Into Operas Values (1, "Fidelio", 1);
Insert Into Operas Values (2, "La flauta mágica", 2);
Insert Into Operas Values (3, "El Barbero de Sevilla", 4);
Insert Into Operas Values (4, "Mefistofele", 5);
Insert Into Operas Values (5, "La Fuerza del destino", 6);

-- Y queremos mostrar en una consulta el nombre de la
-- ópera junto con el de su autor. En caso de que falte
-- algún dato, que aparezca el campo con valor nulo,
-- pero en cualquier caso que no omita el registro.
-- Cabe destacar, que realizando un Cross Join, no 
-- solucionamos el problema, pues este tipo de 
-- combinación omite siempre los valores nulos.

SELECT Autores.Nombre As Autor, Operas.Título
FROM
(
(
Select Id As Autor From Autores
Union
Select Autor From Operas
) AS T LEFT JOIN Operas
ON T.Autor = Operas.Autor
) LEFT JOIN Autores
ON T.Autor = Autores.Id;

-- Se trata por tanto de crear una consulta de unión
-- intermedia, que contenga todos los valores posibles
-- de ambas tablas, y armar la consulta final en base
-- a ella.

Drop Table Autores;
Drop Table Operas;

Ramon Poch. Terrassa a 04/06/2008