IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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

Requêtes MySQL Discussion :

UPDATE me supprime des valeurs


Sujet :

Requêtes MySQL

  1. #1
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 032
    Points
    34 032
    Billets dans le blog
    14
    Par défaut UPDATE me supprime des valeurs
    Bonjour,
    Suite de mes aventures d'importation de valeurs d'une base non normalisée vers une normalisée...

    1) Contexte
    Dans la base actuelle, non normalisée, une table 'dictionnaire.dicodon' contient des variables que j'importe dans la table 'cartodico.variables' de la base normalisée.
    Certaines de ces variables existantes ont des libellés, d'autres non.
    Il y a des libellés supplémentaires dans la table 'dictionnaire.libelvar'. Il serait trop long et inutile d'expliquer pourquoi.
    J'ai pu importer les 6103 variables différentes (sur 10030 lignes) de 'dictionnaire.dicodon' vers 'cartodico.variables' avec toutes les colonnes pour lesquelles j'avais des informations uniques pour chaque variable.
    Je souhaite maintenant importer les libellés, d'abord de 'dictionnaire.dicodon', puis les libellés supplémentaires de 'dictionnaire.libelvar'.

    2) Ce qui marche
    La requête ci-dessous me permet d'importer 2814 libellés de 'dictionnaire.dicodon' donc dans 2814 variables sur 6103 de ma table 'cartodico.variables'.
    Code : 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
    19
    20
    21
    22
    23
    /** Importation des libellés de 'dictionnaire.dicodon' dans 'cartodico.variables' */
    CREATE TEMPORARY TABLE dictionnaire.variables_bis
    SELECT D.libelle, tmp.VarIndex
    FROM dictionnaire.dicodon D
    INNER JOIN 
    (
     SELECT CZ.ZDNom, CI.ImpNomTable, CV.VarAttribut, CV.VarIndex
     FROM cartodico.imports CI
     INNER JOIN cartodico.zonesdepot CZ ON CZ.ZDIndex = CI.ImpZoneDepot
     INNER JOIN cartodico.variables CV ON CI.ImpIndex = CV.VarImport
    )tmp
    ON tmp.ZDNom = D.base_orig
    AND tmp.ImpNomTable = D.table_orig
    AND tmp.VarAttribut = D.code_attr
    GROUP BY D.base_orig, D.table_orig, D.code_attr
    HAVING libelle <> "";
     
    UPDATE cartodico.variables V
    SET V.VarLibelleCourt = (SELECT VB.libelle
      FROM dictionnaire.variables_bis VB
    WHERE V.VarIndex = VB.VarIndex);
     
    DROP TABLE variables_bis;
    La partie entre parenthèses 'SELECT CZ.ZDNom, CI.ImpNomTable, ...' me permet d'avoir la correspondance des 6103 variables avec celles de 'dicodon'
    Le premier 'SELECT D.libelle, tmp.VarIndex...' me donne les 2814 libellés à importer et le n° de chaque variable où le libellé sera importé.

    Après cette requête, j'ai donc dans 'cartodico.variables' :
    - 2814 variables avec VarLibelleCourt NOT NULL ;
    - 3289 variables avec VarLibelleCourt NULL.

    3) Ce qui ne marche pas
    J'essaie de faire pareil avec la requête ci-dessous pour importer les libellés supplémentaires de 'dictionnaire.libelvar' :
    Code : 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
    19
    20
    21
    22
    23
    CREATE TEMPORARY TABLE dictionnaire.variables_ter
    SELECT L.libelle, tmp.VarIndex
    FROM dictionnaire.libelvar L
    INNER JOIN 
    (
     SELECT CZ.ZDNom, CI.ImpNomTable, CV.VarAttribut, CV.VarIndex
     FROM cartodico.imports CI
     INNER JOIN cartodico.zonesdepot CZ ON CZ.ZDIndex = CI.ImpZoneDepot
     INNER JOIN cartodico.variables CV ON CI.ImpIndex = CV.VarImport
     WHERE VarLibelleCourt IS NULL 
    )tmp
    ON tmp.ZDNom = L.base_orig
    AND tmp.ImpNomTable = L.table_orig
    AND tmp.VarAttribut = L.code_attr
    GROUP BY L.base_orig, L.table_orig, L.code_attr
    HAVING L.libelle <> ""; 
     
    UPDATE cartodico.variables V
    SET V.VarLibelleCourt = (SELECT VT.libelle
      FROM dictionnaire.variables_ter VT
    WHERE V.VarIndex = VT.VarIndex);
     
    DROP TABLE dictionnaire.variables_ter;
    De la même manière, la partie entre parenthèses 'SELECT CZ.ZDNom, CI.ImpNomTable, ...' me permet d'avoir la correspondance des 3289 variables dont le libellé est NULL avec les variables issues de 'dicodon'.
    Le premier 'SELECT D.libelle, tmp.VarIndex...' me donne les 256 libellés à importer et le n° de chaque variable où le libellé sera importé.
    Le problème est que le 'UPDATE' met à jour 3070 enregistrements de 'cartodico.variables', soit les 256 nouveaux libellés et met à NULL (valeur par défaut) tous les autres enregistrements !

    J'ai essayé de déplacer ou de supprimer les parenthèses de la clause WHERE du UPDATE mais ça me renvoie une erreur à chaque fois.

    Comment faire pour que ce UPDATE ne modifie que les 256 variables concernées et laisse les autres tranquilles ?
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  2. #2
    Membre confirmé Avatar de SphynXz
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    439
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 439
    Points : 547
    Points
    547
    Par défaut
    n'y à t-il pas un critère qui permettrait d'identifier ces fameux 256 entrées?
    OU Sont-ce les premières 256 entrées?
    OU y à t-il un jointure réalisable entre ta table _ter et la table que tu souhaite Updater
    I don't know what will be used in the next world war, but the 4th will be fought with stones. - Albert Einstein
    Pour détourner un avion, il faut monter dedans - Frédéric beigbeder

  3. #3
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 032
    Points
    34 032
    Billets dans le blog
    14
    Par défaut
    J'ai essayé le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    UPDATE cartodico.variables
    INNER JOIN dictionnaire.variables_ter
    ON cartodico.variables.VarIndex = dictionnaire.variables_ter.VarIndex
    SET cartodico.variables.VarLibelleCourt = (SELECT VT.libelle
      FROM dictionnaire.variables_ter VT
      WHERE V.VarIndex = VT.VarIndex);
    et plusieurs variantes avec des clauses WHERE en fin de requête mais j'ai l'erreur suivante :
    #1137 - Impossible de r�ouvrir la table: 'variables_ter
    EDIT : J'y suis arrivé autrement, en demandant de ne mettre à jour que les enregistrement pour lesquels VarLibelleCourt est NULL :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    UPDATE cartodico.variables V
    SET V.VarLibelleCourt = (SELECT VT.libelle
      FROM dictionnaire.variables_ter VT
      WHERE V.VarIndex = VT.VarIndex)
    WHERE V.VarLibelleCourt IS NULL;
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  4. #4
    Membre confirmé Avatar de SphynXz
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    439
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 439
    Points : 547
    Points
    547
    Par défaut
    EDIT : J'y suis arrivé autrement, en demandant de ne mettre à jour que les enregistrement pour lesquels VarLibelleCourt est NULL :
    tu as donc répondu à la première question des 3 :p
    I don't know what will be used in the next world war, but the 4th will be fought with stones. - Albert Einstein
    Pour détourner un avion, il faut monter dedans - Frédéric beigbeder

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Supprimer des valeurs d'un tableau
    Par Trax31 dans le forum C
    Réponses: 8
    Dernier message: 30/05/2013, 12h27
  2. [Débutant] Supprimer des valeurs
    Par Abu Maria. dans le forum MATLAB
    Réponses: 3
    Dernier message: 03/06/2012, 01h30
  3. [Débutant] Supprimer des valeurs récurrentes
    Par Matty86 dans le forum MATLAB
    Réponses: 2
    Dernier message: 31/01/2011, 17h20
  4. Supprimer des valeurs d'un tableau
    Par rollergirl dans le forum Langage
    Réponses: 16
    Dernier message: 03/09/2010, 22h27
  5. supprimer des valeurs dans un vecteur
    Par christophe_halgand dans le forum MATLAB
    Réponses: 2
    Dernier message: 10/07/2009, 14h14

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