Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server > Développement
Développement Forum d'entraide sur le Transact-SQL, le CLR, les procédures stockées, les triggers, les requêtes SQL
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 28/07/2011, 17h33   #1
Invité de passage
 
clermidy guillaume
Inscription : mai 2010
Messages : 3
Détails du profil
Informations personnelles :
Nom : clermidy guillaume

Informations forums :
Inscription : mai 2010
Messages : 3
Points : 0
Points : 0
Par défaut insert et sous requete.

Bonjour à tous,

Je cherche à savoir s'il existe une syntaxe sql pour lire plusieurs champs dans une sous requête et mettre à jour plusieurs champs.

J'explique:

Code :
1
2
3
UPDATE MATABLE
SET MONCHAMPS1=(SELECT CHAMPS FROM MATABLE WHERE ...),
MONCHAMPS2=(SELECT CHAMPS FROM MAABLE WHERE ...)

Tout ceci fonctionne mais n'est pas très performant.

Je cherche le moyen de ne faire qu'une seule sous requête, car dans mon cas la sous requête est assez lourdes est est exécutée plus d'une fois !! ...

Merci d'avance à ceux qui liront et à ceux qui répondront!
GUIGUItwo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/07/2011, 22h18   #2
Membre éprouvé
 
Homme Hamid MIRA
Ingénieur développement logiciels
Inscription : septembre 2003
Messages : 177
Détails du profil
Informations personnelles :
Nom : Homme Hamid MIRA
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : septembre 2003
Messages : 177
Points : 413
Points : 413
Si toutes les clauses FROM des sous requêtes sont identiques et si également toutes les clauses WHERE des sous requêtes sont identiques (et portent sur la clé primaire) et si seuls les nom des champs changent, alors cela laisse fort à parier que la table faisant l'objet de l'Update est "dénormalisée". Cela arrive souvent dans les environnements OLAP où la base a fait l'objet d'une dénormalisation.

Imaginons les 3 tables csuivantes :
. Table Produit
Produit (IdProduit, Nom, Prix, IdCategorie )
. Table Catégorie
Categorie (IdCategorie, Code, Libelle, FraisDePort)
. Table ProduitEtCategorie ( table dénormalisée)
ProduitEtCategorie(IdProduit, Nom, Prix, IdCategorie, Code, Libelle, FraisDePort)

Si, dans la table ProduitEtCategorie, on veut mettre à jour les champs Code, Libelle, FraisDePort, depuis la table Categorie, on aurait tendance, de prime abord, à écrire ceci :

Code SQL :
1
2
3
4
5
UPDATE A 
   SET A.Code = (SELECT A.Code FROM Categorie C WHERE C.IdCategorie = A.IdCategorie), 
       A.Libelle = (SELECT A.Libelle FROM Categorie C WHERE C.IdCategorie = A.IdCategorie), 
       A.FraisDePort = (SELECT A.FraisDePort FROM Categorie Z WHERE C.IdCategorie = A.IdCategorie) 
FROM ProduitEtCategorie  A

Une autre solution plus optimale serait de transformer la requête comme ceci :
Code SQL :
1
2
3
4
5
6
7
UPDATE A 
   SET A.Code = C.Code, 
       A.Libelle = C.Libelle,  
       A.FraisDePort = C.FraisDePort 
FROM ProduitEtCategorie  A
INNER JOIN Categorie C 
  ON C.IdCategorie = A.IdCategorie
A+
__________________
"Une idée mal écrite est une idée fausse !"
hmira est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/07/2011, 11h06   #3
Invité de passage
 
clermidy guillaume
Inscription : mai 2010
Messages : 3
Détails du profil
Informations personnelles :
Nom : clermidy guillaume

Informations forums :
Inscription : mai 2010
Messages : 3
Points : 0
Points : 0
Merci pour la réponse je me doutais bien qu'il devait y avoir une solution !
GUIGUItwo est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 14h02.


 
 
 
 
Partenaires

Hébergement Web