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 :

Update depuis la même table


Sujet :

Langage SQL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 53
    Points : 43
    Points
    43
    Par défaut Update depuis la même table
    Bonjour,
    Je suis en t-sql sur du sql server 2008. Admettons que je doive mettre à jour le champs "couleur" de l'enregistrement n°14 de la table "maTable" avec la couleur de l'enregistrement n°20. J'ai écris la requête suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    UPDATE maTable
    SET couleur = source.couleur
    FROM maTable source
    WHERE source.id = 14
    AND id = 20
    Je ne comprends pas pourquoi cette requête ne fonctionne pas, elle s'exécute correctement mais aucune ligne n'est affectée par l'update (les enregistrements existent bien je les ai testé avec un select sur les mêmes valeur d'id).
    Je me demande s'il ne s'agit pas d'un problème d'alias de table, en effet j'avais avant indiqué "maTable" dans la clause where mais la requête tombe en erreur: "The multi-part identifier "maTable.id" could not be bound"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    UPDATE maTable
    SET couleur = source.couleur
    FROM maTable source
    WHERE source.id = 14
    AND maTable.id = 20
    Quelqu'un voit où est mon erreur?
    merci à tous

  2. #2
    Membre chevronné
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Points : 1 806
    Points
    1 806
    Par défaut
    Vous n'interrogez qu'une fois la table. Il va donc chercher un enregistrement qui ait à la fois id = 14 et id = 20, ce qui est peu probable

    Il faut interroger deux fois la table :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    UPDATE toChange
    SET couleur = (SELECT source.couleur FROM maTable source WHERE source.id = 20)
    FROM maTable toChange
    WHERE toChange.id = 14

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 53
    Points : 43
    Points
    43
    Par défaut
    Votre requête est effectivement celle que j'ai fini par faire.

    Concernant ma première proposition je ne comprends toujours pas le problème, pour moi je n'appelle pas deux fois la même table puisque j'utilise un alias et le FROM, normalement il devrait voir deux tables différentes, c'est comme lorsqu'on fait l'update en masse suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    UPDATE B
    SET B.couleur = A.couleur
    FROM A
    WHERE A.nom = B.nom
    Cette requête va mettre à jour la table B en mettant la couleur trouvée dans la table A pour tous les enregistrements de A et B ayant le même nom. C'est une requête que j'utilise régulièrement qui marche très bien.

    J'ai donc voulu faire la même chose mais sur une même table, avec l'alias à mon sens il fait la distinction entre les 2 et n'essaye pas de faire id=14 et id=20, mais bien id=14 et source.id=20 (différence entre les 2 tables identiques grâce à l'allias)

  4. #4
    Membre chevronné
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Points : 1 806
    Points
    1 806
    Par défaut
    Non, ce n'est pas comme ça que ça fonctionne. L'alias devient l'identifiant de la table dans la requête, il ne "multiplie" pas l'accès à la table. C'est d'ailleurs pour ça que le SGBD vous signale, quand vous posez un alias, que vous ne pouvez plus l'appeler simplement par son nom - pour lui, le nom de la table ne référence plus rien (il ne voit plus que l'alias).

    On pourrait donc faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    UPDATE maTable
    SET couleur = source.couleur
    FROM maTable, maTable source
    WHERE maTable.id = 14
        AND source.id = 20

  5. #5
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Février 2010
    Messages : 4 153
    Points : 7 403
    Points
    7 403
    Billets dans le blog
    1
    Par défaut
    La véritable syntaxe est la suivante :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    update alias_destination
    set alias_destination.valeur = alias_source.valeur
    from matable alias_destination
    cross join matable alias_source
    where alias_destination.id = 14
    and alias_source.id = 20
    On ne jouit bien que de ce qu’on partage.

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 53
    Points : 43
    Points
    43
    Par défaut
    Merci StringBuilder c'est bon

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

Discussions similaires

  1. [CR XI] Comment sommer certains champs et pas d'autres depuis une même table source
    Par MaasDVSue dans le forum SAP Crystal Reports
    Réponses: 7
    Dernier message: 17/10/2014, 11h52
  2. [MySQL-5.1] UPDATE SELECT sur même table
    Par Invité dans le forum Requêtes
    Réponses: 2
    Dernier message: 02/08/2013, 10h08
  3. Réponses: 3
    Dernier message: 16/04/2009, 12h00
  4. Update utilisant la même table
    Par Arnaud F. dans le forum Langage SQL
    Réponses: 5
    Dernier message: 15/10/2008, 11h04
  5. UPDATE sur la même table
    Par Papino dans le forum Décisions SGBD
    Réponses: 5
    Dernier message: 02/09/2005, 10h38

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