Données.
Je dispose de la table FLU suivante :
table FLU de déapart
FLU_ID | PADT | CONTRAT | CODE-FLUX
76 | 10 | 20 | 30
77 | 10 | 20 | 30
78 | 10 | 20 | 30
Je souhaite me débarrasser des lignes 77, et 78, car ce sont des doublons. Mais avant je dois mettre a jour les table qui pointe sur FLU, en leur précisant de garder uniquement le FLU_ID le plus petit (ici 76) pr un meme triplet (PADT, CONTRAT, CODE-FLUX), car c'est ce triplet qui est la "vraie" clé fonctionelle.
Ma table ACH pointe sur le FLU_ID de la table FLU, elle a cette allure
table ACH de départ
ACH_FLU_FK | Destinataire
76 | 'Dupont'
78 | 'Durand'
Objectif :
Je veux mettre a jour la colonne ACH.ACH_FLU_FK=78 par la valeur 76.
pour avoir au final
table ACH d'arrivée
ACH_FLU_FK | Destinataire
76 | 'Dupont'
76 | 'Durand'
et
table FLU d'arrivée
FLU_ID | PADT | CONTRAT | CODE-FLUX
76 | 10 | 20 | 30
Quelle requêtre d'update puis-je écrire pour la table ACH, avant d'effacer les doublons de FLU. ?
Merci par avance pour votre aide.
# besoin de cours ?
Posté par jaroug (site web personnel) . Évalué à 2.
[^] # Re: besoin de cours ?
Posté par FueL . Évalué à 2.
Je sais bien, mais tout ça n'est que la partie emergé des conséquences d'une migration, suite a des modifications des règles métier... Et justement on cherche a banir cette redondance.
Merci pr le lien.
# .
Posté par snt . Évalué à 2.
create table flu ...
create table ach ...
insert into flu ...
insert into ach ...
[^] # Re: .
Posté par snt . Évalué à 3.
update ACH a, FLU f1, FLU f2
set a.ACH_FLU_FK = f2.flu_id
where
f1.flu_id = a.ACH_FLU_FK and
f1.padt = f2.padt and
f1.contrat = f2.contrat and
f1.code_flux = f2.code_flux
and (f1.padt, f1.contrat, f1.code_flux) in
( select padt,contrat,code_flux from FLU group by padt,contrat,code_flux having count(*)>1 )
and f2.flu_id in ( select min(flu_id) from FLU group by padt,contrat,code_flux having count(*)>1 )
and f1.flu_id<>f2.flu_id ;
-- devrait passer sur oracle
delete from FLU f3 where f3.flu_id in (
select f1.flu_id
from FLU f1, FLU f2
where
f1.padt = f2.padt and
f1.contrat = f2.contrat and
f1.code_flux = f2.code_flux
and (f1.padt, f1.contrat, f1.code_flux) in
( select padt,contrat,code_flux from FLU group by padt,contrat,code_flux having count(*)>1 )
and f2.flu_id in ( select min(flu_id) from FLU group by padt,contrat,code_flux having count(*)>1 )
and f1.flu_id<>f2.flu_id ) ;
[^] # Re: .
Posté par FueL . Évalué à 1.
Mais tu sais, c'était pas obligé de faire ca en une seule requete, mais merci qd meme !!!
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.