Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

HyperFileSQL Discussion :

Comment faire un UPDATE avec jointure ?


Sujet :

HyperFileSQL

  1. #1
    Membre chevronné
    Comment faire un UPDATE avec jointure ?
    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...
    SQL : le véritable Esperanto

    "Les patates à ta tata épatent ton tonton mais les pates aux thons à ton tonton épatent pas ta tata." (Michel Souris)

    MERCI DE NE PAS M'ENVOYER DE MESSAGE PRIVE POUR DES QUESTIONS TECHNIQUES SANS MON ACCORD !

  2. #2
    Expert éminent
    Merci pour l'astuce Michel. Cela confirme ce que je crois : Windev n'est pas (encore ?) fait pour la grosse artillerie SQL.

    "Faire des requêtes simples (voire faire du bourrin) et retravailler derrière pour affiner", telle est ma devise.

    PS : C'est un peu ce que tu as fait, non ?
    Commencez toujours appuyer sur la touche F1 et puis n'hésitez à passer par un moteur de recherche...
    Le forum est fait pour répondre aux questions : pas la peine de me les envoyer par MP. Merci.

    Make it real not fantasy.

  3. #3
    Membre chevronné
    Citation Envoyé par frenchsting Voir le message
    Merci pour l'astuce Michel. Cela confirme ce que je crois : Windev n'est pas (encore ?) fait pour la grosse artillerie SQL.

    "Faire des requêtes simples (voire faire du bourrin) et retravailler derrière pour affiner", telle est ma devise.

    PS : C'est un peu ce que tu as fait, non ?
    Oui, un peu... disons que j'ai cherché comment arriver à un résultat équivalent à une requête d'UPDATE avec jointure sans passer par de l'algo.... et j'ai finalement trouver cette solution qui n'est pas franchement "naturelle".
    SQL : le véritable Esperanto

    "Les patates à ta tata épatent ton tonton mais les pates aux thons à ton tonton épatent pas ta tata." (Michel Souris)

    MERCI DE NE PAS M'ENVOYER DE MESSAGE PRIVE POUR DES QUESTIONS TECHNIQUES SANS MON ACCORD !

  4. #4
    Expert éminent
    Peut être pas naturelle, mais pragmatique...

    Il vaut mieux une solution qui fonctionne qu'une réflexion interminable qui n'aboutit pas...
    Commencez toujours appuyer sur la touche F1 et puis n'hésitez à passer par un moteur de recherche...
    Le forum est fait pour répondre aux questions : pas la peine de me les envoyer par MP. Merci.

    Make it real not fantasy.

###raw>template_hook.ano_emploi###