1. #1
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    mars 2009
    Messages
    1 256
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : mars 2009
    Messages : 1 256
    Points : 2 125
    Points
    2 125

    Par défaut 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 confirmé
    Avatar de frenchsting
    Homme Profil pro
    mutlitâche-multifonction
    Inscrit en
    juin 2003
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : mutlitâche-multifonction
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : juin 2003
    Messages : 2 764
    Points : 4 675
    Points
    4 675

    Par défaut

    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 par là : et puis n'hésitez à passer par là : ou par un autre moteur de recherche...
    Pas de question par MP s'il vous plait. Le forum est fait pour cela...

    Make it real not fantasy

  3. #3
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    mars 2009
    Messages
    1 256
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : mars 2009
    Messages : 1 256
    Points : 2 125
    Points
    2 125

    Par défaut

    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 confirmé
    Avatar de frenchsting
    Homme Profil pro
    mutlitâche-multifonction
    Inscrit en
    juin 2003
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : mutlitâche-multifonction
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : juin 2003
    Messages : 2 764
    Points : 4 675
    Points
    4 675

    Par défaut

    Peut être pas naturelle, mais pragmatique...

    Il vaut mieux une solution qui fonctionne qu'une réflexion interminable qui n'aboutit pas...
    Commencez toujours par là : et puis n'hésitez à passer par là : ou par un autre moteur de recherche...
    Pas de question par MP s'il vous plait. Le forum est fait pour cela...

    Make it real not fantasy

Discussions similaires

  1. Requête comment faire un Update avec une concaténation
    Par Chocolat49 dans le forum MS SQL-Server
    Réponses: 11
    Dernier message: 13/02/2014, 20h39
  2. [SP-2007] Comment faire mon Update avec SPListItem
    Par alexdr59 dans le forum SharePoint
    Réponses: 1
    Dernier message: 27/07/2010, 10h55
  3. Réponses: 5
    Dernier message: 30/11/2009, 11h14
  4. comment faire un setfocus avec before update ?
    Par mat75019 dans le forum Access
    Réponses: 7
    Dernier message: 14/04/2006, 11h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo