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

MS SQL Server Discussion :

UPDATE avec INNER JOIN


Sujet :

MS SQL Server

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2004
    Messages : 129
    Points : 103
    Points
    103
    Par défaut UPDATE avec INNER JOIN
    Bonjour,

    J'ai comme tâche en ce moment de tranférer une application Access en application Web. La structure de la BD ne peut malheureusement être modifié. Dans une des fonctions du programme access il y a un dizaine d'update du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    UPDATE TableB INNER JOIN TableA ON (TableB .date= TableA .date) AND (TableB .Article= TableA .Article) SET TableA .Ordre5 = TableA .[Ordre5] + TableB .[Qté] where TableB .Article= '" & strArticle & "';")
    Puisque Sql server ne semble accepter qu'une table dans le UPDATE j'ai tenté de modifier la requête comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    UPDATE TableA SET Ordre5 = a.[Ordre5] + b.[Qté] 
    FROM TableA a, TableB b
    WHERE b.date= a.date AND b.Article= a.Article AND TableB .Article= @Article
    Ça ne semble pas fonctionner. En fait, si dans la table TableB j'ai 100 et 200 alors dans la table TableA je me retrouve avec 100 plutôt qu'avec 300. J'ai fait des recherches sur Internet et j'ai vu que le mieux serait de modifier la structure de la BD mais comme je l'ai mentionné on ne m'autorise pas à modifier la structure. J'ai pensé utiliser des curseurs pour faire les updates mais puisqu'il y a une dizaine de updates à faire j'ai peur que les performance en souffre.

    Donc est-ce que quelqu'un à une solution qui pourrait m'aider Il faut que le tout fonctionne le plus rapidement possible et je n'ai pas encore trouver de solution.

    Merci !

  2. #2
    Membre éclairé
    Avatar de efficks
    Inscrit en
    Septembre 2005
    Messages
    712
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 712
    Points : 776
    Points
    776
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    UPDATE TableA
    SELECT a.[Ordre5] + b.[Qté]
    FROM TableA a, TableB b
    WHERE b.date= a.date AND b.Article= a.Article AND TableB .Article= @Article
    Essaye ceci.
    Avant de poster : FAQ, tutos, rechercher, google, ... Après :
    Merci

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2004
    Messages : 129
    Points : 103
    Points
    103
    Par défaut
    Citation Envoyé par efficks
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    UPDATE TableA
    SELECT a.[Ordre5] + b.[Qté]
    FROM TableA a, TableB b
    WHERE b.date= a.date AND b.Article= a.Article AND TableB .Article= @Article
    Essaye ceci.
    Merci pour ta réponse ! J'ai essayé le code que tu m'as donné mais ca ne semble pas fonctionner. En fait, j'ai une erreur détectée sur le mot SELECT (Incorrect syntax near the keyword 'SELECT'.).
    Ne manque t-il pas un SET dans ce que tu m'as donné? J'ai essayé d'ajouter SET a.[Ordre5] = devant le SELECT mais ca ne fonctionne pas non plus.

    Pour l'instant je suis entrain de régler le problème en utilisant des curseurs mais si quelqu'un a une solution plus performante j'aimerais bien la connaître.

    Merci !

  4. #4
    Membre éclairé
    Avatar de efficks
    Inscrit en
    Septembre 2005
    Messages
    712
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 712
    Points : 776
    Points
    776
    Par défaut
    Je suis désolé, je me suis trompé avec un INSERT à partir d'un SELECT. Je cherche à nouveau...
    Avant de poster : FAQ, tutos, rechercher, google, ... Après :
    Merci

  5. #5
    Rédacteur/Modérateur

    Avatar de Fabien Celaia
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2002
    Messages
    4 222
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2002
    Messages : 4 222
    Points : 19 551
    Points
    19 551
    Billets dans le blog
    25
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    INSERT INTO TableA (Liste des colonnes...)
    (SELECT a.[Ordre5] + b.[Qté]
    FROM TableA a, TableB b
    WHERE b.date= a.date 
    AND b.Article= a.Article 
    AND TableB .Article= @Article )
    Sr DBA Oracle / MS-SQL / MySQL / Postgresql / SAP-Sybase / Informix / DB2

    N'oublie pas de consulter mes articles, mon blog, les cours et les FAQ SGBD

    Attention : pas de réponse technique par MP : pensez aux autres, passez par les forums !

  6. #6
    Membre éclairé
    Avatar de efficks
    Inscrit en
    Septembre 2005
    Messages
    712
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 712
    Points : 776
    Points
    776
    Par défaut
    Y a t'il moyen de faire la même chose avec un UPDATE?
    Avant de poster : FAQ, tutos, rechercher, google, ... Après :
    Merci

  7. #7
    Membre habitué
    Inscrit en
    Mars 2004
    Messages
    126
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 126
    Points : 151
    Points
    151
    Par défaut
    Salut
    essait ca:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    UPDATE TableA
      SET Ordre5 = a.[Ordre5] + b.[Qté]
        FROM TableA a
        INNER JOIN TableB b
          ON ( b.[date] = a.[date] ) And
             ( b.[Article] = a.[Article] )
        WHERE ( b.Article = @Article )

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2004
    Messages : 129
    Points : 103
    Points
    103
    Par défaut
    Merci pour vos réponses ! Je vais essayer ça et je vous en redonne des nouvelles !

    EDIT:
    J'ai essayé le code mais ca ne fonctionne pas. En fait, j'obtient le même résultat c'est-à-dire que j'obtien 100 plutôt que 300.

    J'ai trouvé sur les Group news de Google exactement le même problème que j'ai:
    http://groups.google.com/group/comp....5ba5f22628ac21

    In SQL, this means that you are updating the result of the INNER JOIN;
    that working table disappears at the end of the statement. Kinda
    useless, unh?

    ACCESS is not SQL -- not even close! It will take about a year to
    un-learn it.

    If you reallllly, realllly want to scew up your database, we can tell
    you how to use a scalar subquery and cross joins to do this. But it
    is like asking what is the best kind of rock to use to drive screws
    into fine furniture.
    Après avoir lu ça j'ai finalement opté pour les curseurs. De toute façon j'ai des tests et les performance sont très acceptable alors je vais garder cette solution.

    Merci !

  9. #9
    Débutant Avatar de amazircool
    Inscrit en
    Décembre 2005
    Messages
    497
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 497
    Points : 152
    Points
    152
    Par défaut
    salut :
    essai de facilite (partager la requte) c'est a dire evite de travaiulle avec le requele impriquer.
    execute les requete un aprés l autre sequetillement.
    "L'éducation, c'est le début de la richesse, et la richesse n'est pas destinée à tout le monde"

  10. #10
    Membre éclairé
    Avatar de efficks
    Inscrit en
    Septembre 2005
    Messages
    712
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 712
    Points : 776
    Points
    776
    Par défaut
    Citation Envoyé par amazircool
    salut :
    essai de facilite (partager la requte) c'est a dire evite de travaiulle avec le requele impriquer.
    execute les requete un aprés l autre sequetillement.
    Tu sais que ta phrase est incompréhensible?
    Avant de poster : FAQ, tutos, rechercher, google, ... Après :
    Merci

  11. #11
    Débutant Avatar de amazircool
    Inscrit en
    Décembre 2005
    Messages
    497
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 497
    Points : 152
    Points
    152
    Par défaut okkkkkkkk
    Ok tout simplement mon frère je veut dire.
    Il faut éviter de travailler avec les requêtes Imbriquer, c'est-à-dire il faut exécuter 2 requêtes
    L un après autre au lieu que une requête imbrique.
    Ok je crois c’est facile a lire comme sa :=)
    "L'éducation, c'est le début de la richesse, et la richesse n'est pas destinée à tout le monde"

  12. #12
    Expert éminent
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Points : 9 506
    Points
    9 506
    Par défaut Re: UPDATE avec INNER JOIN
    Citation Envoyé par steelidol
    J'ai pensé utiliser des curseurs pour faire les updates mais puisqu'il y a une dizaine de updates à faire j'ai peur que les performance en souffre.
    J'ai le mm pb que veux-tu dire par curseur?
    Merci d'avance.
    "Winter is coming" (ma nouvelle page d'accueil)

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

Discussions similaires

  1. Requête update avec inner join
    Par mattmax dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 23/05/2013, 14h53
  2. [Débutant] Update avec INNER JOIN
    Par deado dans le forum C#
    Réponses: 17
    Dernier message: 27/03/2013, 20h33
  3. REQUETE UPDATE avec INNER JOIN
    Par vero81 dans le forum SQL
    Réponses: 1
    Dernier message: 07/08/2009, 16h45
  4. Problème avec UPDATE et INNER JOIN
    Par korbn dans le forum Requêtes
    Réponses: 2
    Dernier message: 25/05/2009, 20h52
  5. [Oracle] problème avec INNER JOIN
    Par Philofish dans le forum Langage SQL
    Réponses: 5
    Dernier message: 15/09/2005, 10h20

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