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.

Preguntas similare

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.



Respuesta Responder a este mensaje
#2 Carmen
13/08/2003 - 09:53 | Informe spam
Muchas gracias.
"Liliana Sorrentino" escribió en el mensaje
news:#
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.
>
>
>


email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida