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

  1. #1
    Futur Membre du Club
    Inscrit en
    mars 2006
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : mars 2006
    Messages : 8
    Points : 5
    Points
    5

    Par défaut Update à partir d'un select

    Bonjour,

    Sous access je cherche simplement à faire en SQL un update d'une table à partir d'un select count d'une autre table.

    J'ai essayer les syntaxes suivantes mais sans succès :
    • update test2 set nbr from (select count(id) from test1 where test1.valeur = test2.valeur)
    • update test2 set nbr = (select count(id) from test1 where test1.valeur = test2.valeur)
    • update test2 set nbr = Dcount( "*", "test1", "test1.valeur = test2.valeur")


    Bon en clair je galère et je n'arrive pas à trouver de l'aide sur le web.

  2. #2
    Expert éminent
    Avatar de tee_grandbois
    Homme Profil pro
    retraité mais encore activé
    Inscrit en
    novembre 2004
    Messages
    4 455
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité mais encore activé

    Informations forums :
    Inscription : novembre 2004
    Messages : 4 455
    Points : 7 610
    Points
    7 610

    Par défaut

    bonsoir,
    la dernière solution est la bonne, après une petite correction:
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    update test2 set nbr = Dcount( "*", "test1", "valeur=" & test2.valeur)
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...

  3. #3
    Futur Membre du Club
    Inscrit en
    mars 2006
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : mars 2006
    Messages : 8
    Points : 5
    Points
    5

    Par défaut

    Un grand merci

    Cela fonctionne.

    Sans abuser mais tout de même ...

    Juste pour être sûr, n'y a t-il pas moyen de faire un Update du style update test2 set nbr from (select count(id) from test1 where test1.valeur = test2.valeur) qui permet d'être plus proche d'un SQL classique ?

    De plus je me demande comment faire
    1 - Pour mettre à jour plusieurs champs en une seule passe -> Peut-on dans Dcount mettre à jour plusieurs champs ou faut-il le faire plusieurs fois ?
    2 - Comment faire un Update qui va rechercher des valeurs dans une autre table en mélangeant des valeurs unitaire avec des count ?
    Du style : (update test2 set nbr, libellé (select count(id), libellé from test1 where test1.valeur = test2.valeur group by valeur,libellé) <- l'exemple n'est pas forcément le plus représentatif

  4. #4
    Expert éminent
    Avatar de tee_grandbois
    Homme Profil pro
    retraité mais encore activé
    Inscrit en
    novembre 2004
    Messages
    4 455
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité mais encore activé

    Informations forums :
    Inscription : novembre 2004
    Messages : 4 455
    Points : 7 610
    Points
    7 610

    Par défaut

    Juste pour être sûr, n'y a t-il pas moyen de faire un Update du style (update test2 set nbr from (select count(id) from test1 where test1.valeur = test2.valeur) qui permet d'être plus proche d'un SQL classique ?
    non car le SQL d'Access (qui n'est pas 100% standard) ne permet pas de faire des mises à jour avec des requêtes de regroupement, d'où l'obligation de passer par les fonctions de domaine...
    De plus je me demande comment faire
    1 - Pour mettre à jour plusieurs champs en une seule passe -> Peut-on dans Dcount mettre à jour plusieurs champs ou faut-il le faire plusieurs fois ?
    en une seule passe c'est possible: il faut mettre un Dcount() par champ mais les performances peuvent se dégrader rapidement avec des tables volumineuses:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    update test2 set nbr = Dcount( "*", "test1", "valeur=" & test2.valeur),
     nbr3 = Dcount( "*", "test1", "valeur3=" & test2.valeur3), 
     nbr4 = Dcount( "*", "test1", "valeur4=" & test2.valeur4);
    2 - Comment faire un Update qui va rechercher des valeurs dans une autre table en melangant des valeurs unitaire avec des count ?
    Du style : (update test2 set nbr, libellé (select count(id), libellé from test1 where test1.valeur = test2.valeur group by valeur,libellé)
    comme la première réponse ce ne sera pas possible avec des requêtes de regroupement, il faudra passer par des créations de tables intermédiaires créées pour l'occasion, certes ce n'est pas classique mais c'est la seule solution ou alors il y a la solution VBA mais alors il faut en maitriser l'utilisation.
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...

  5. #5
    Futur Membre du Club
    Inscrit en
    mars 2006
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : mars 2006
    Messages : 8
    Points : 5
    Points
    5

    Par défaut

    Pour finir

    En dehors de l'utilisation de la fonction Dcount (équivalent d'un select count) la syntaxe pour mettre à jour une table à partir d'une autre est la suivante :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    update test2,test1  set test2.valeur = test1.valeur where test2.id = test1.id

    Et d'après mes tests, pour mettre à jour une table seule une autre table peut être utilisée. Il ne semble pas possible d'utiliser une Query.

    Est-ce bien cela ?
    Existe-il une encore autre syntaxe ?

  6. #6
    Expert éminent
    Avatar de tee_grandbois
    Homme Profil pro
    retraité mais encore activé
    Inscrit en
    novembre 2004
    Messages
    4 455
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité mais encore activé

    Informations forums :
    Inscription : novembre 2004
    Messages : 4 455
    Points : 7 610
    Points
    7 610

    Par défaut

    non, il est tout à fait possible d'utiliser une requête tant que cette requête ne fait pas de regroupement.
    Une sous-requête peut utiliser plusieurs tables:
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    UPDATE t_facture AS f,
    (SELECT codefacture, round(montant * taux,2) as TT_taxe FROM T_Facture_Detail  AS D, tbl_TVA WHERE Taux="A") as D
    SET f.mt_taxe = [mt_taxe]+[D].[TT_taxe] 
    WHERE (f.N°=[d].[codefacture]);
    La seule exception où l'utilisation d'un regroupement est possible c'est quand il est utilisé dans un critère:
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    UPDATE T_Facture AS f SET f.stRéglé = True
    WHERE (select sum(d.montant) from T_facture_Detail d where (d.codefacture) = f.commande)= f.[mt_contrat];

    Sinon on peut éviter de passer par les fonctions de domaine en utilisant le cumul (set champ = champ + 1):
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE test2 INNER JOIN test1 ON test2.id = test1.id SET test2.nbr = test2.[nbr] + 1;
    attention, si le champ à mettre à jour est nul, il faut utiliser Nz() sinon il ne sera pas mis à jour:
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    SET test2.nbr = Nz(test2.nbr,0) + 1;
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...

  7. #7
    Rédacteur/Modérateur
    Avatar de User
    Homme Profil pro
    Développeur informatique
    Inscrit en
    août 2004
    Messages
    6 225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : août 2004
    Messages : 6 225
    Points : 12 943
    Points
    12 943
    Billets dans le blog
    11

    Par défaut

    Salut,

    Citation Envoyé par tee_grandbois Voir le message

    Sinon on peut éviter de passer par les fonctions de domaine en utilisant le cumul (set champ = champ + 1):
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE test2 INNER JOIN test1 ON test2.id = test1.id SET test2.nbr = test2.[nbr] + 1;
    attention, si le champ à mettre à jour est nul, il faut utiliser Nz() sinon il ne sera pas mis à jour:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SET test2.nbr = Nz(test2.nbr,0) + 1;
    Oui, c'est l'idée que j'avais eu également.

    Attention quand même, si la requête s'exécute plusieurs fois tu vas avoir des cumuls supplémentaires.

    Il faudrait donc prévoir une autre requête update pour mettre les compteurs à 0, avant l'exécution de la requête utilisant le cumul ;-)

    Cdlt,
    Vous trouverez dans la FAQ, les sources ou les tutoriels, de l'information en abondance, plein de bonnes choses à consulter sans modération

    Si vous souhaitez mettre en place une gestion de planning, une gestion de stock, de ventes/achats ou tout autre application Access, je peux vous proposer mes services.
    Pour cela n'hésitez pas à me contacter par courriel ou mp.


    Simple comme bonjour et merci

    Mes tutoriels et contributions sur ma page personnelle.

  8. #8
    Expert éminent
    Avatar de tee_grandbois
    Homme Profil pro
    retraité mais encore activé
    Inscrit en
    novembre 2004
    Messages
    4 455
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité mais encore activé

    Informations forums :
    Inscription : novembre 2004
    Messages : 4 455
    Points : 7 610
    Points
    7 610

    Par défaut

    bonjour User,
    Il faudrait donc prévoir une autre requête update pour mettre les compteurs à 0, avant l'exécution de la requête utilisant le cumul ;-)
    cela me semblait évident au point que je n'en ai pas fait mention, mais c'est vrai, c'est mieux de le faire remarquer. Du coup, l'utilisation du Nz() est inutile si on met le champ à 0 au préalable.
    Merci.
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...

  9. #9
    Futur Membre du Club
    Inscrit en
    mars 2006
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : mars 2006
    Messages : 8
    Points : 5
    Points
    5

    Par défaut

    Vous êtes super

    Un grand merci pour ces réponses complètes

  10. #10
    Expert éminent
    Avatar de tee_grandbois
    Homme Profil pro
    retraité mais encore activé
    Inscrit en
    novembre 2004
    Messages
    4 455
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité mais encore activé

    Informations forums :
    Inscription : novembre 2004
    Messages : 4 455
    Points : 7 610
    Points
    7 610

    Par défaut

    de rien.
    Pense à mettre le sujet en
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...

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

Discussions similaires

  1. Update a partir d'un select
    Par olibara dans le forum Langage SQL
    Réponses: 7
    Dernier message: 12/10/2008, 19h03
  2. Update d'une table a partir d'un select recursif
    Par olibara dans le forum Langage SQL
    Réponses: 1
    Dernier message: 17/05/2008, 09h44
  3. Update a partir d'une selection
    Par choubak dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 29/05/2007, 17h28
  4. [oracle 9i]update à partir d'une selection complexe
    Par Requin15 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 13/06/2006, 10h18
  5. UPDATE globale à partir d'un SELECT
    Par lilianen dans le forum Oracle
    Réponses: 2
    Dernier message: 28/11/2005, 15h55

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