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:
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:
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...
Recent comments
7 years 44 weeks ago
7 years 47 weeks ago
7 years 50 weeks ago
8 years 3 weeks ago
8 years 24 weeks ago
8 years 25 weeks ago
8 years 33 weeks ago
8 years 33 weeks ago
8 years 33 weeks ago
8 years 33 weeks ago