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 alias et jointure


Sujet :

MS SQL Server

  1. #1
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut Update avec alias et jointure
    J'ai un peu chipoté pour trouver, j'ai meme lu des post qui disaient que ce n'etait pas possible.
    Donc puisque ca marche quand meme et que ce n'est pas evident (a mon sens) j'illustre, si ca peut servir à d'autres

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    UPDATE
      UU
      set
      UU.Comment = 'patch',
      UU.hrkreel=XXX.r_ref,
      UU.prixReel=XXX.r_zi_pr_st,
      UU.etatReel=case when XXX.r_pc_state=100 then 'OK' else 
      case when XXX.r_pc_state=40 then 'HS' else 'KO' end end   
    FROM         
    tmp_bonus_342 UU
     INNER JOIN tmp_9797Remain AS XXX ON XXX.CD = UU.refInternal

  2. #2
    Membre Expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Par défaut
    Je doute que çà marche avec cette indentation

    Ok je sors...

  3. #3
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut
    Citation Envoyé par iberserk
    Je doute que çà marche avec cette indentation
    Premierement : l'indentation n'a rien a voir avec l'interpretation du code
    Deuxièmement : sur quoi te base-tu et qu'est ce qui précisement te permet de dire que ca ne marche pas ?

  4. #4
    Expert confirmé
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Par défaut
    Pourquoi ceci ne serait il pas possible ?

    Vous pouvez tout à fait mettre un alias dans la clause UPDATE qui fait référence à la table dans la clause FROM

    ++

  5. #5
    Membre Expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Par défaut
    Je doute que çà marche avec cette indentation

    Ok je sors...
    __________________
    Mais relisez mon post! Je plaisantais! d'ou le smiley
    Je vous taquinez juste sur votre indentation qui n'étais pas super super lisible mais bon on peut plus rigoler un peu...

  6. #6
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut
    Troll detected !

    Citation Envoyé par iberserk
    Mais relisez mon post! Je plaisantais! d'ou le smiley
    Je vous taquinez juste sur votre indentation qui n'étais pas super super lisible mais bon on peut plus rigoler un peu...
    Dans cet esprit là tu dois tellement te tordre de rire avec l'indentation automatique de SSMS qu'il n'y a plus grand chose qui devrait marcher
    En dehors de cette digression ....



    Merci Mikedavem
    tu a raison mais n'etant pas expert en syntaxe SQL j'avais avant tout cherché sur google et j'étais tombé sur des post spécifiant que Sql Server n'acceptait pas cette syntaxe pour un Update.
    J'ai quand meme essayé et je suis tres heureux que ca fonctionne.

  7. #7
    Membre Expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Par défaut
    J'ai dis que je plaisantais, pas que je me tordais de rire malheureusement...
    [Mode Rattrapage ON]
    Sql Server n'acceptait pas cette syntaxe pour un Update
    C'est même couremment utilisé, peut-être pouvez vous demander à l'ajouter dans la FAQ?
    [Mode Rattrapage OFF]
    J'en profites toutefois pour sensibiliser sur les "bonnes pratiques" concernant l'indentation des requêtes via ce lien vers un article de SQLPRO:
    http://sqlpro.developpez.com/cours/standards/
    Et blague mis à part cette fois-ci, le respect de ces règles permet une relecture plus aisée des requêtes surtout quand elles deviennent compliquées (ce qui n'est pas le cas du cas présent).

    Sans rancune olibara et merci pour votre contribution...

  8. #8
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut
    Tout a fait d'accord avec les regles d'indentation, je suis moi meme maniaque de la lisibilité dans des language comme C#, C++ etc

    Pour SQL j'ai meme ecrit un petit formatteur qui permet de remettre en forme le desordre systématiquement engendré par SSMS et accessoirement generer la requete sous forme de string verbatim ou de stringbuilder en C#
    A ce niveau je voulais précisément souligner les resultat deplorable et imbuvables générés pas SSMS. Et si par malheur on repasse une jolie requete bien formattée dans SSMS elle en ressort plus que chiffonée

    C'est la raison pour laquelle le resultat de mes test fonctionnel tout fraichement pondu souffrait encore de quelques distorsions meme apres un passage d'urgence aux premiers soins

    Donc s'il y a une pierre a jeter sur le sujet, SSMS pourait généreusement hériter du premier pavé !

  9. #9
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Le meilleur outil de formatage des requêtes reste la barre d'espace !

  10. #10
    Membre Expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Par défaut
    olibara->C'est sûr que je ne peux m'empecher des CTRL+E D dans SSMS... sans succès malheureusement

  11. #11
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    Je peux me tromper, mais il me semble que cette syntaxe n'est acceptée par SQL Server que depuis la version 2008 !

    on parle bien de
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    UPDATE UnAlias
    SET ...
    FROM UneTable As UnAlias

    Et non pas simplement de
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    UPDATE UnVraiNomDeTableTable
    SET UneColonne = UnAlias.UneColonne
    FROM UneAutreTable As UnAlias
    ...

    C'est pourquoi Olibara, tu as pu lire que cette syntaxe n'était pas acceptée...

  12. #12
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    En 2005 les mises à jour en utilisant l'alias fonctionnent.

  13. #13
    Expert confirmé
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Par défaut
    Je confirme après avoir regardé la documentation.

    ++

  14. #14
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    Citation Envoyé par mikedavem Voir le message
    Je confirme après avoir regardé la documentation.

    ++
    Laquelle est quand même facétieuse :

    SQL Server 2005 :
    [ WITH <common_table_expression> [...n] ]
    UPDATE
    [ TOP ( expression ) [ PERCENT ] ]
    { <object> | rowset_function_limited
    [ WITH ( <Table_Hint_Limited> [ ...n ] ) ]
    }
    SET
    ...

    [...]
    <object> ::=
    {
    [ server_name . database_name . schema_name .
    | database_name .[ schema_name ] .
    | schema_name .
    ]
    table_or_view_name}
    SQL Server 2008
    [ WITH common_table_expression [...n] ]
    UPDATE
    [ TOP (expression) [ PERCENT ] ]
    { { table_alias | <object> | rowset_function_limited
    [ WITH (table_hint_limited [ ...n ] ) ]
    }
    | @table_variable
    }
    SET

    ...
    Mais en effet, si on prend la peine de descendre plus bas dans la doc de 2005 :

    FROM <table_source>
    Spécifie qu'une table, une vue ou une source de table dérivée sont utilisées pour fournir les valeurs destinées à servir de critères en vue de la mise à jour. Pour plus d'informations, consultez FROM (Transact-SQL).

    Si l'objet mis à jour est le même que l'objet de la clause FROM et s'il n'existe qu'une seule référence à cet objet de la clause FROM, un alias d'objet pourra être spécifié ou non. Si l'objet mis à jour apparaît plusieurs fois dans la clause FROM, l'une des références, mais une seule, à cet objet ne doit pas spécifier un alias de la table. Toutes les autres références à l'objet dans la clause FROM doivent inclure un alias d'objet.
    ...

    Citation Envoyé par aieeeuuuuu Voir le message
    Je peux me tromper, mais il me semble que cette syntaxe n'est acceptée par SQL Server que depuis la version 2008 !

  15. #15
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Par défaut
    Comme de toute façon une modification de données ne peut se faire que sur une table à la fois, l'alias dans l'UPDATE est inutile dans ton cas.

    Dans ta requête le préfixe UU. est aussi inutile, pour la même raison.

    Il devient utile quand on réalise une auto-jointure (FROM uneTable JOIN uneTable), car dans ce cas SQL Server ne sait pas quelle table il doit mettre à jour suivant le prédicat de jointure et les éventuels filtres

    Donc on peut écrire, proprement indenté :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    UPDATE		tmp_bonus_342
    SET		Comment = 'patch',
    		hrkreel = XXX.r_ref,
    		prixReel = XXX.r_zi_pr_st,
    		etatReel = CASE 
    					WHEN XXX.r_pc_state = 100 THEN 'OK' ELSE CASE 
    											WHEN XXX.r_pc_state = 40 THEN 'HS'
    											ELSE 'KO'
    										END
    					END
    FROM		tmp_bonus_342 AS UU
    INNER JOIN	tmp_9797Remain AS XXX ON XXX.CD = UU.refInternal
    @++

  16. #16
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Les goûts et les couleurs... De mon côté c'est tout le contraire d'Elsuket.
    Même si on ne peut mettre à jour qu'une table à la fois, je considère dès lors qu'il y a plus d'une table dans le FROM qu'il faut explicitement nommer tables et colonnes.
    Ma table ayant reçu un alias, je préfère utiliser ce dernier.
    Bien entendu, ça ne change rien en terme d'exécution.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    UPDATE UU
       SET UU.Comment  = 'patch',
           UU.hrkreel  = XXX.r_ref,
           UU.prixReel = XXX.r_zi_pr_st,
           UU.etatReel = CASE XXX.r_pc_state
                           WHEN 100 THEN 'OK'
                           WHEN  40 THEN 'HS'
                           ELSE 'KO'
                         END
      FROM dbo.tmp_bonus_342 AS UU
           INNER JOIN dbo.tmp_9797Remain AS XXX
             ON XXX.CD = UU.refInternal
    Et je préfère mon indentation aussi

  17. #17
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut
    Pour conclure j'ai beaucoup d'estime les compétences et l'aide apporté par Elsuket et de tout le monde en général
    Pour la forme du cas present j'adhere tout a fait aux remarques de waldar, je prefere son indentation et j'aime autant nommer explicitement la table, ca simplifie la lecture et la compréhension du code

Discussions similaires

  1. UPDATE avec alias non reconnu?!
    Par MinsK dans le forum Requêtes
    Réponses: 4
    Dernier message: 05/10/2010, 15h04
  2. UPDATE avec alias
    Par MinsK dans le forum Requêtes
    Réponses: 1
    Dernier message: 15/10/2009, 14h45
  3. problème requête avec alias et jointure
    Par shelko dans le forum Requêtes
    Réponses: 6
    Dernier message: 22/03/2009, 11h06
  4. Requete Update avec sous requete et jointure
    Par javaboy dans le forum Langage SQL
    Réponses: 2
    Dernier message: 09/05/2007, 11h03
  5. [PL/SQL] update avec jointure
    Par Fox_magic dans le forum Oracle
    Réponses: 6
    Dernier message: 09/12/2004, 12h19

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