Forum Programmation.autre SQL : Requête d'update pas triviale.

Posté par  .
Étiquettes : aucune
0
10
août
2005
Je voudrais updater des ids d'une table avec des valeurs contenues dans la table de référence. Mais j'ai du mal à trouver la requête SQL qui pourrait le faire.


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  (site web personnel) . Évalué à 2.

    La redondance c'est mal, les clés ca permet d'eviter ca. Pour ce qui est de mise a jour de table les clés etrangères ça peut aider ( on update/delete cascade toussa). Si t'as besoin de cours jette un oeil ici http://www.info.univ-angers.fr/pub/genest/enseignement/index.html(...)
    • [^] # Re: besoin de cours ?

      Posté par  . Évalué à 2.

      Arghh me tapez pas sur les doigts :(
      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  . Évalué à 2.

    je veux bien tenter de faire tes devoirs à ta place mais faut au moins me filer un script de creation d'un jeu d'essai ;-)

    create table flu ...
    create table ach ...
    insert into flu ...
    insert into ach ...
    • [^] # Re: .

      Posté par  . Évalué à 3.

      -- passe sur mysql
      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  . Évalué à 1.

        Merci pr le cp de main, je suis pas au boulot mais demain j'essaye et je te tiens au crt.
        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.