Join con 3 tablas con correspondencias de 1 a n

12/08/2003 - 12:48 por Carmen | Informe spam
Tengo las siguientes tablas:

ProveedorActividades. Esta tabla indica en qué actividades trabaja un
proveedor. Una actividad viene identificada por 4 campos: área, grupo,
sector y actividad. Los campos de esta tabla serían los siguientes:
NIF
Cod_area
Cod_grupo
Cod_sector
Cod_actividad

Contratos. Esta tabla recoge los datos de un contrato con un proveedor para
realizar una actividad. Para poder contratar a un proveedor para realizar
una actividad es preciso que el proveedor trabaje en esa actividad
(ProveedoresActividades). Los campos de la tabla contrato serían:
NIF
Cod_area
Cod_grupo
Cod_sector
Cod_actividad
Contrato
Otros_campos
donde NIF, cod_area, cod_grupo, cod_sector y cod_actividad son FK de
ProveedoresActividades.
Ahora, se ha cambiado la codificación de las actividades, de tal forma que
una actividad (área, grupo, sector,actividad) se convierte en una o n nuevas
actividades (área2, grupo2, sector2, actividad2), es decir, a una actividad
origen le pueden corresponder una o más actividades destino. La tabla de
correspondencias tendría los siguientes campos:
Cod_area1
Cod_grupo1
Cod_sector1
Cod_actividad1
Cod_area2
Cod_grupo2
Cod_sector2
Cod_actividad2

Lo que se necesita hacer es actualizar las tablas de ProveedoresActividades
y Contratos para recoger la nueva codificación de las actividades.
Con ProveedoresActividades no hay problemas porque si a una actividad origen
le corresponden n actividades destino se añaden tanto registros
ProveedoresActividades como actividades destino, es decir, que si el
proveedor 1 trabaja en 01 01 01 01 y la actividad 01 01 01 01 se corresponde
con A 01 01 01 y B 01 01 01, en ProveedoresActividades aparecerán dos
registros para el proveedor 1, uno con la actividad A 01 01 01 y otro con la
actividad B 01 01 01.
Sin embargo, no sé como puedo modificar la tabla de contratos de forma que 1
contrato se quede como 1 contrato, es decir, sólo tengo que actualizar el có
digo de la actividad y no incrementar el número de registros de contratos.
La nueva actividad del contrato puede ser cualquiera de la actividades
nuevas que se correspondan con la actividad antigua, pero teniendo en cuenta
que para que un proveedor se contrate para una actividad, el proveedor tiene
que trabajar en esa actividad (tabla ProveedoresActividades). ¿Cómo puedo
coger de entre todas las correspondencias una única y que esté en
ProveedoresActividades?

Muchas gracias de antemano por vuestra ayuda.
 

Leer las respuestas

#1 Liliana Sorrentino
12/08/2003 - 15:38 | Informe spam
Hola Carmen,
Te mando los datos de prueba que usé para que corrobores si es lo que se
puede presentar en la realidad, con estos datos funciona bien.
Espero que te sirva, saludos...
Liliana.

drop table #ProveedorActividades
create table #ProveedorActividades
( NIF char(10),
Cod_area smallint,
Cod_grupo smallint,
Cod_sector smallint,
Cod_actividad smallint)
insert #ProveedorActividades
select ' abcde', 11, 11, 11, 11 union
select ' abcde', 12, 12, 12, 12 union
select ' abcde', 13, 13, 13, 13 union
select ' fghij', 21, 21, 21, 21 union
select ' abcde', 22, 22, 22, 22

drop table #Contrato
create table #Contrato
( NIF char(10),
Cod_area smallint,
Cod_grupo smallint,
Cod_sector smallint,
Cod_actividad smallint,
Contrato smallint)
insert #Contrato
select ' abcde', 10, 10, 10, 10, 1 union
select ' abcde', 20, 20, 20, 20, 2 union
select ' fghij', 20, 20, 20, 20, 2

drop table #Correspondencias
create table #Correspondencias
( Cod_area1 smallint,
Cod_grupo1 smallint,
Cod_sector1 smallint,
Cod_actividad1 smallint,
Cod_area2 smallint,
Cod_grupo2 smallint,
Cod_sector2 smallint,
Cod_actividad2 smallint)
insert #Correspondencias
select 10, 10, 10, 10, 11, 11, 11, 11 union
select 10, 10, 10, 10, 12, 12, 12, 12 union
select 10, 10, 10, 10, 13, 13, 13, 13 union
select 20, 20, 20, 20, 21, 21, 21, 21 union
select 20, 20, 20, 20, 22, 22, 22, 22

update #Contrato
set Cod_area = Cod_area2,
Cod_grupo = Cod_grupo2,
Cod_sector = Cod_sector2,
Cod_actividad = Cod_actividad2

from
(select contrato, cont.nif, Cod_area2 = min(Cod_area2), Cod_grupo2 min(Cod_grupo2), Cod_sector2 = min(Cod_sector2), Cod_actividad2 min(Cod_actividad2)

from #ProveedorActividades prov

inner join #Correspondencias corr
on corr.cod_area2 = prov.cod_area and corr.cod_grupo2 prov.cod_grupo and
corr.cod_sector2 = prov.cod_sector and corr.cod_actividad2 prov.cod_actividad

inner join #Contrato cont
on cont.nif = prov.nif and cont.cod_area = corr.cod_area1 and
corr.cod_grupo1 = cont.cod_grupo and
corr.cod_sector1 = cont.cod_sector and corr.cod_actividad1 cont.cod_actividad

group by contrato, cont.nif) tabla

inner join #Contrato cont
on cont.contrato = tabla.contrato AND cont.nif = tabla.nif



"Carmen" escribió en el mensaje
news:
Tengo las siguientes tablas:

ProveedorActividades. Esta tabla indica en qué actividades trabaja un
proveedor. Una actividad viene identificada por 4 campos: área, grupo,
sector y actividad. Los campos de esta tabla serían los siguientes:
NIF
Cod_area
Cod_grupo
Cod_sector
Cod_actividad

Contratos. Esta tabla recoge los datos de un contrato con un proveedor


para
realizar una actividad. Para poder contratar a un proveedor para realizar
una actividad es preciso que el proveedor trabaje en esa actividad
(ProveedoresActividades). Los campos de la tabla contrato serían:
NIF
Cod_area
Cod_grupo
Cod_sector
Cod_actividad
Contrato
Otros_campos
donde NIF, cod_area, cod_grupo, cod_sector y cod_actividad son FK de
ProveedoresActividades.
Ahora, se ha cambiado la codificación de las actividades, de tal forma que
una actividad (área, grupo, sector,actividad) se convierte en una o n


nuevas
actividades (área2, grupo2, sector2, actividad2), es decir, a una


actividad
origen le pueden corresponder una o más actividades destino. La tabla de
correspondencias tendría los siguientes campos:
Cod_area1
Cod_grupo1
Cod_sector1
Cod_actividad1
Cod_area2
Cod_grupo2
Cod_sector2
Cod_actividad2

Lo que se necesita hacer es actualizar las tablas de


ProveedoresActividades
y Contratos para recoger la nueva codificación de las actividades.
Con ProveedoresActividades no hay problemas porque si a una actividad


origen
le corresponden n actividades destino se añaden tanto registros
ProveedoresActividades como actividades destino, es decir, que si el
proveedor 1 trabaja en 01 01 01 01 y la actividad 01 01 01 01 se


corresponde
con A 01 01 01 y B 01 01 01, en ProveedoresActividades aparecerán dos
registros para el proveedor 1, uno con la actividad A 01 01 01 y otro con


la
actividad B 01 01 01.
Sin embargo, no sé como puedo modificar la tabla de contratos de forma que


1
contrato se quede como 1 contrato, es decir, sólo tengo que actualizar el



digo de la actividad y no incrementar el número de registros de contratos.
La nueva actividad del contrato puede ser cualquiera de la actividades
nuevas que se correspondan con la actividad antigua, pero teniendo en


cuenta
que para que un proveedor se contrate para una actividad, el proveedor


tiene
que trabajar en esa actividad (tabla ProveedoresActividades). ¿Cómo puedo
coger de entre todas las correspondencias una única y que esté en
ProveedoresActividades?

Muchas gracias de antemano por vuestra ayuda.



Preguntas similares