Bonjour à tous,
Voici une anecdote qui, je l'espère, peut vous être utile.
Un beau jour j'ai eu besoin de faire une jointure dans un UPDATE sur une table Hyperfile.
Il se trouve également que la table en question devait être jointe à elle même (ceci afin d'appliquer une restriction).
Je ne vais pas m'attardais sur la structure de cette table. Disons que c'est une table classique de gestion des communes françaises avec comme particularité la gestion de l'historique grâce des dates de début et de fin de validité.
Voici la requête que je souhaitais exécuter :
Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 UPDATE CommuneFR C1 INNER JOIN CommuneFR C2 on C1.NomCommune = C2.NomCommune SET C1.CodePostal = C2.CodePostal, C1.DateFinValidite = '19760101', C2.DateDebutValidite = '19760101' where LEFT(C2.CodeINSEE,2) IN ('2A','2B') AND LEFT(C1.CodeINSEE, 2) = '20' ;
ps : vous l'aurez compris, ou pas, mais il s'agit de mettre à jour les codes postaux des communes "historiques" de la Corse avec les codes postaux des communes actuelles... bref... on s'en fout.
La requête ci-desssus est bien accepté par HF mais ne permet pas de mettre à jour le champs CodePostal (sauf si c'était un truc en dur comme les dates), je vais pas m'étendre la dessus car ça a déjà été évoqué dans d'autres threads, notamment ici : http://www.developpez.net/forums/d86...asee-jointure/
Voici la mécanique (stupide mais effective) mise en place pour arriver à quelque chose d'équivalent :
Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 --Je commence par dupliquer les enregistrements INSERT INTO CommuneFR(CodePostal, CodeINSEE, NomCommune, NomCommuneMM, DateFinValidite) SELECT C2.CodePostal, C1.CodeINSEE, C1.NomCommune, C1.NomCommuneMM, '19760101' FROM CommuneFR C1 inner join CommuneFR C2 on C1.NomCommune = C2.NomCommune where LEFT(C2.CodeINSEE,2) IN ('2A', '2B') AND LEFT(C1.CodeINSEE, 2) = '20' ;--* --Je crée une table recensant les doublons CREATE TABLE CommuneFR_Temp AS SELECT CodeINSEE FROM CommuneFR WHERE LEFT(CodeINSEE,2) = '20' and NVL(CodePostal,'') <> ''; --* --Je delete les doublons en me basant sur la table en question (je pouvais pas me baser sur la table elle-même, HF n'aime pas) DELETE FROM CommuneFR C1 INNER JOIN CommuneFR_Temp C2 on C1.CodeINSEE = C2.CodeINSEE WHERE C1.CodePostal = '' AND LEFT(C1.CodeINSEE,2) = '20' ;--* --Je drop la table tampon DROP TABLE CommuneFR_Temp;--*
'oilà ! Après c'est pas élégant, absolument pas optimisé mais ça a le mérite de marcher...
Partager