Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server
MS SQL-Server Forum Microsoft SQL-Server. Avant de poster -> FAQ SQL-Server, Tutoriels SQL-Server
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 24/03/2011, 15h43   #1
Membre Expert
 
Inscription : octobre 2007
Messages : 3 938
Détails du profil
Informations forums :
Inscription : octobre 2007
Messages : 3 938
Points : 1 905
Points : 1 905
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 :
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
__________________
« Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)
olibara est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/03/2011, 18h30   #2
Membre Expert
 
Avatar de iberserk
 
Homme Bruno IGNACE
Architecte de base de données
Inscription : novembre 2004
Messages : 1 299
Détails du profil
Informations personnelles :
Nom : Homme Bruno IGNACE
Âge : 30
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 299
Points : 2 282
Points : 2 282
Envoyer un message via MSN à iberserk
Je doute que çà marche avec cette indentation

Ok je sors...
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
iberserk est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 24/03/2011, 20h12   #3
Membre Expert
 
Inscription : octobre 2007
Messages : 3 938
Détails du profil
Informations forums :
Inscription : octobre 2007
Messages : 3 938
Points : 1 905
Points : 1 905
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 ?
__________________
« Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)
olibara est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/03/2011, 20h13   #4
Responsable SQL Server

 
Avatar de mikedavem
 
Homme David BARBARIN
Expert SQL Server
Inscription : août 2005
Messages : 3 723
Détails du profil
Informations personnelles :
Nom : Homme David BARBARIN
Localisation : France, Haute Savoie (Rhône Alpes)

Informations professionnelles :
Activité : Expert SQL Server
Secteur : Conseil

Informations forums :
Inscription : août 2005
Messages : 3 723
Points : 6 844
Points : 6 844
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

++
mikedavem est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/03/2011, 20h14   #5
Membre Expert
 
Avatar de iberserk
 
Homme Bruno IGNACE
Architecte de base de données
Inscription : novembre 2004
Messages : 1 299
Détails du profil
Informations personnelles :
Nom : Homme Bruno IGNACE
Âge : 30
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 299
Points : 2 282
Points : 2 282
Envoyer un message via MSN à iberserk
Citation:
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...
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
iberserk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/03/2011, 21h11   #6
Membre Expert
 
Inscription : octobre 2007
Messages : 3 938
Détails du profil
Informations forums :
Inscription : octobre 2007
Messages : 3 938
Points : 1 905
Points : 1 905
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.
__________________
« Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)
olibara est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/03/2011, 21h23   #7
Membre Expert
 
Avatar de iberserk
 
Homme Bruno IGNACE
Architecte de base de données
Inscription : novembre 2004
Messages : 1 299
Détails du profil
Informations personnelles :
Nom : Homme Bruno IGNACE
Âge : 30
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 299
Points : 2 282
Points : 2 282
Envoyer un message via MSN à iberserk
J'ai dis que je plaisantais, pas que je me tordais de rire malheureusement...
[Mode Rattrapage ON]
Citation:
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...
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
iberserk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/03/2011, 22h45   #8
Membre Expert
 
Inscription : octobre 2007
Messages : 3 938
Détails du profil
Informations forums :
Inscription : octobre 2007
Messages : 3 938
Points : 1 905
Points : 1 905
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é !
__________________
« Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)
olibara est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/03/2011, 22h53   #9
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 684
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 684
Points : 10 445
Points : 10 445
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Le meilleur outil de formatage des requêtes reste la barre d'espace !
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/03/2011, 07h05   #10
Membre Expert
 
Avatar de iberserk
 
Homme Bruno IGNACE
Architecte de base de données
Inscription : novembre 2004
Messages : 1 299
Détails du profil
Informations personnelles :
Nom : Homme Bruno IGNACE
Âge : 30
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 299
Points : 2 282
Points : 2 282
Envoyer un message via MSN à iberserk
olibara->C'est sûr que je ne peux m'empecher des CTRL+E D dans SSMS... sans succès malheureusement
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
iberserk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/03/2011, 10h11   #11
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
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 :
1
2
3
4
UPDATE UnAlias
SET ...
FROM UneTable As UnAlias

Et non pas simplement de
Code SQL :
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...
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/03/2011, 10h37   #12
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 684
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 684
Points : 10 445
Points : 10 445
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
En 2005 les mises à jour en utilisant l'alias fonctionnent.
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/03/2011, 11h12   #13
Responsable SQL Server

 
Avatar de mikedavem
 
Homme David BARBARIN
Expert SQL Server
Inscription : août 2005
Messages : 3 723
Détails du profil
Informations personnelles :
Nom : Homme David BARBARIN
Localisation : France, Haute Savoie (Rhône Alpes)

Informations professionnelles :
Activité : Expert SQL Server
Secteur : Conseil

Informations forums :
Inscription : août 2005
Messages : 3 723
Points : 6 844
Points : 6 844
Je confirme après avoir regardé la documentation.

++
mikedavem est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/03/2011, 11h29   #14
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
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 :
Citation:
[ 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
Citation:
[ 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 :

Citation:
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 !
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/03/2011, 12h15   #15
Modérateur

 
Avatar de elsuket
 
Homme Nicolas Souquet
Administrateur de base de données
Inscription : janvier 2005
Messages : 4 667
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Souquet
Âge : 30
Localisation : Thaïlande

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

Informations forums :
Inscription : janvier 2005
Messages : 4 667
Points : 8 715
Points : 8 715
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 :
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
@++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes.
Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012
elsuket est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/03/2011, 14h13   #16
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 684
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 684
Points : 10 445
Points : 10 445
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
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 :
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
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 26/03/2011, 18h00   #17
Membre Expert
 
Inscription : octobre 2007
Messages : 3 938
Détails du profil
Informations forums :
Inscription : octobre 2007
Messages : 3 938
Points : 1 905
Points : 1 905
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
__________________
« Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)
olibara est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 22h57.


 
 
 
 
Partenaires

Hébergement Web