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 et SQL. Discussion :

UPDATE avec sous requête de sélection avec regroupement


Sujet :

Requêtes et SQL.

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    52
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Février 2008
    Messages : 52
    Points : 33
    Points
    33
    Par défaut UPDATE avec sous requête de sélection avec regroupement
    Bonjour,

    Je n'arrive pas à mettre à jour un champs d'une table pour certains enregistrements.

    J'ai d'abord créer une requête pour sélectionner les enregistrements que je voulais modifier

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT  Mouvement.code_stat
    FROM Mouvement INNER JOIN ligne_mouvements ON (Mouvement.Date_creat = ligne_mouvements.Date_creat) AND (Mouvement.[N° bon consigne] = ligne_mouvements.[N° bon consigne])
    GROUP BY Mouvement.[N° bon consigne], Mouvement.Date_creat, Mouvement.[Code transporteur], Mouvement.code_stat
    HAVING (((Count(ligne_mouvements.type_mvt))=2) AND ((Sum(IIf([type_mvt]="RF",[qte_mvt],0))-Sum(IIf([type_mvt]="LP",[qte_mvt],0)))=0));
    cette requête marche parfaitement. Je trouve 872 enregistrements.

    Ensuite je veux modifier la valeur de mon champ Mouvement.code_stat
    j'ai écrit le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    UPDATE Mouvement
    SET Mouvement.code_stat ="D"
    WHERE Mouvement.code_stat in (SELECT  Mouvement.code_stat
    FROM Mouvement INNER JOIN ligne_mouvements ON (Mouvement.Date_creat = ligne_mouvements.Date_creat) AND (Mouvement.[N° bon consigne] = ligne_mouvements.[N° bon consigne])
    GROUP BY Mouvement.[N° bon consigne], Mouvement.Date_creat, Mouvement.[Code transporteur], Mouvement.code_stat
    HAVING (((Count(ligne_mouvements.type_mvt))=2) AND ((Sum(IIf([type_mvt]="RF",[qte_mvt],0))-Sum(IIf([type_mvt]="LP",[qte_mvt],0)))=0)));
    Cette requête modifie tous les enregistrements de ma table MOuvemenent (2694 enregistrements) et pas juste les 872 enregistrements que j'avais précédemment sélectionné.
    J'espère que c'est très clair. J'ai beaucoup cherché. Je ne trouve pas. En fait, si on travaille uniquement en mode création sur les requêtes d'Access, le problème vient du passage de la requête de sélection où j'active les regroupements et la requête de Mise à jour où je n'arrive pas à faire la mise à jour sur la sélection avec regroupement d'origine.
    Je continue malgré tout d'explorer le site pour trouver le chemin pour y arriver.
    Si quelqu'un voit une piste merci d'avance.

  2. #2
    J1
    J1 est déconnecté
    Membre averti Avatar de J1
    Inscrit en
    Mai 2004
    Messages
    321
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 321
    Points : 335
    Points
    335
    Par défaut
    Bonjour,

    le différentiel 2694/872 n'est pas forcément incohérent. On pourrait en déduire que les valeurs de code_stat renvoyées par ta sous-requête correspondent à 2694 enregistrements de la table Mouvement.

    Imaginons par exemple que ta sous-requête renvoie les 5 lignes suivantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    code_stat
    1
    2
    2
    3
    4

    et que la table Mouvement soit constituée des 10 enregistrements suivants :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    code_stat
    1
    1
    2
    2
    3
    3
    4
    4
    4
    4
    Les 10 enregistrements de la table Mouvement seront bien mis à jour, car les valeurs de code_stat sont toutes incluses dans celles renvoyées par la sous-requête.

    Je ne sais pas si cela correspond à ton cas de figure, mais ça peut être intéressant de s'en assurer.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    52
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Février 2008
    Messages : 52
    Points : 33
    Points
    33
    Par défaut
    ta remarque est judicieuse. Et en fait je me la suis posé. Aussi j'ai lancé la requête et en fait tous les enregistrements de ma table Mouvement ont pris la modification de la valeur code_stat au lieu des 872.

    Mais sauf si je ne m'abuse quand Access signale le nombre d'enregistrement qu'il va mettre à jour. ce sont bien les enregistrements qui vont subir une réelle modification.

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    52
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Février 2008
    Messages : 52
    Points : 33
    Points
    33
    Par défaut Contournement Malheureusement
    En parcourant le forum, j'ai pris la décision suivante. Arriver au résultat en plusieurs étape. Avec ma première sélection, j'ai créé une table avec les 872 enregistrements que j'ai appelé T.

    Ensuite j'ai modifié tous les enregistrements Mouvement.code_stat de la table T
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE T SET T.code_stat = "D";
    Ensuite j'ai mis à jour la Table Mouvement avec les enregistrements de la table T

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    UPDATE Mouvement INNER JOIN T ON (( Mouvement.Date_creat= T.date_creat) AND ( Mouvement.[N° bon consigne]=T.[N° bon consigne] )) 
    SET Mouvement.[code_stat] = T.[code_stat] ;
    Je m'étais accroché au fait qu'avec un SQL et ACCESS, j'aurais pu obtenir ce résultat en une seule étape. Mais apparemment ce n'est pas possible.

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

Discussions similaires

  1. [AC-2007] Erreur 3070 dans dernière requête en cascade avec sous-requêtes ok
    Par Isayla dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 23/02/2012, 10h05
  2. [FB2]Update avec sous requête resultat ?
    Par AuBozon dans le forum SQL
    Réponses: 1
    Dernier message: 29/02/2008, 21h04
  3. Requête Update avec Sous-requête
    Par Yohann_x dans le forum Requêtes
    Réponses: 8
    Dernier message: 16/02/2008, 13h19
  4. Réponses: 3
    Dernier message: 22/12/2007, 14h06
  5. Débutant: UPDATE d'une table avec sous-requête ?
    Par ctobini dans le forum Débuter
    Réponses: 2
    Dernier message: 03/10/2007, 11h45

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