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

Langage SQL Discussion :

Eviter d’effacer les données précédentes à chaque UPDATE


Sujet :

Langage SQL

  1. #1
    Candidat au Club
    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Juillet 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Technicien Help Desk

    Informations forums :
    Inscription : Juillet 2015
    Messages : 6
    Points : 3
    Points
    3
    Par défaut Eviter d’effacer les données précédentes à chaque UPDATE
    Bonjour,
    Je débute avec les requêtes SQL et j’aurais besoin d’aide pour le problème suivant.
    J’ai une base de données avec deux tables A et B contenant les colonnes suivantes :
    Table A : Id,Moy,Niveau
    1203, NULL,2
    1305,NULL,1
    1706,NULL,3
    1809,NULL,1
    Table B : Id, MoyNiveau1, MoyNiveau2, MoyNiveau3,
    1203, 10, 20, 30
    1305, 22, 44, 66
    1706, 1,44,56
    1809,3,6,66
    J’essaye de remplir la colonne Moy de ma table A avec la valeur correspondant à son niveau et au même Id dans le tableau B, c’est-à dire que je souhaiterai obtenir ceci :
    1203, 20,2
    1305,22,1
    1706,56,3
    1809,3,1
    Sous Microsoft SQL Server Management Studio j’exécute le code suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    UPDATE A
    SET A.Moy = (SELECT B. MoyNiveau1 FROM B WHERE ((B.Id = A.Id) and ('1' = A.Niveau)));
    UPDATE A
    SET A.Moy = (SELECT B. MoyNiveau2 FROM B WHERE ((B.Id = A.Id) and ('2' = A.Niveau)));
    UPDATE A
    SET A.Moy = (SELECT B. MoyNiveau3 FROM B WHERE ((B.Id = A.Id) and ('3' = A.Niveau)));
    Mais la dernière requête (pour le niveau 3) efface le résultat des deux précédentes et je me retrouve avec ceci :
    1203, NULL,2
    1305, NULL,1
    1706,56,3
    1809, NULL,1
    Je me doute que ce n’est pas la bonne méthode mais je ne trouve pas d’alternative.
    Merci d’avance pour votre aide !

  2. #2
    Candidat au Club
    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Juillet 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Technicien Help Desk

    Informations forums :
    Inscription : Juillet 2015
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Je m'en uis sorti en rajoutant un "Where A.Moy IS NULL" à chaque update :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    UPDATE A
    SET A.Moy = (SELECT B. MoyNiveau1 FROM B WHERE ((B.Id = A.Id) and ('1' = A.Niveau)))
    Where A.Moy IS NULL;
    UPDATE A
    SET A.Moy = (SELECT B. MoyNiveau2 FROM B WHERE ((B.Id = A.Id) and ('2' = A.Niveau)))
    Where A.Moy IS NULL;
    UPDATE A
    SET A.Moy = (SELECT B. MoyNiveau3 FROM B WHERE ((B.Id = A.Id) and ('3' = A.Niveau)))
    Where A.Moy IS NULL;
    Si vous avez plus élégant je suis preneur !

  3. #3
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 126
    Points : 38 509
    Points
    38 509
    Billets dans le blog
    9
    Par défaut
    Le problème vient de la modélisation de la base de données : redondance de la colonne niveau dans la table B qui ne respecte pas la 1ère forme normale

    à partir de là, pas d'algèbre relationnelle possible, on est donc contraint de faire des bidouilles

  4. #4
    Candidat au Club
    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Juillet 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Technicien Help Desk

    Informations forums :
    Inscription : Juillet 2015
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Merci à toi Escartefigue pour ta réponse

  5. #5
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 776
    Points
    30 776
    Par défaut
    La mise à jour peut être effectuée en une seule requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    UPDATE  A
        SET A.Moy = 
            (   SELECT  CASE A.Niveau
                            WHEN '1' THEN B.MoyNiveau1
                            WHEN '2' THEN B.MoyNiveau2
                            WHEN '3' THEN B.MoyNiveau3
                        END 
                FROM    B
                WHERE   B.Id = A.Id
            )
    --  WHERE   A.Moy IS NULL
    ;
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  6. #6
    Candidat au Club
    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Juillet 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Technicien Help Desk

    Informations forums :
    Inscription : Juillet 2015
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    C'est effectivement plus élégant, merci !

  7. #7
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Sur SQL-Server vous pouvez utiliser cette syntaxe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    update a
       set a.moy = case a.niveau
                     when '1' then b.MoyNiveau1
                     when '2' then b.MoyNiveau2
                     when '3' then b.MoyNiveau3
                   end
      from TableA as a
      join TableB as b on b.id = a.id;

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

Discussions similaires

  1. Un getter qui ne renvoie qu'une fois les données pas à chaque fois
    Par tonytrua dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 17/12/2011, 22h05
  2. [MySQL] afficher les données précédentes en fonction d'une année de sélection
    Par vivi21 dans le forum PHP & Base de données
    Réponses: 0
    Dernier message: 14/06/2011, 16h54
  3. Récupérer les données pour chaque lien à part
    Par rose2011 dans le forum Langages serveur
    Réponses: 0
    Dernier message: 18/08/2010, 12h53
  4. Réponses: 6
    Dernier message: 16/05/2008, 09h04

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