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 :

Problème de mise à jour (UPDATE)


Sujet :

MS SQL Server

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 68
    Points : 40
    Points
    40
    Par défaut Problème de mise à jour (UPDATE)
    Bonjour

    J'ai un problème qui me semble simple et que pourtant, je n'arrive pas à résoudre.
    J'ai une table "Dossiers" avec un champ "Code_Dossier" et "Rang_Max".
    J'ai une table "Relances" avec un champ "Code_Dossier" et "Rang".
    J'ai plusieurs lignes dans la table "Relances" pour un même "Code_Dossier" avec une valeur de "Rang" différente.
    Je souhaite stocker le "Rang" maximum pour chaque "Code_Dossier" dans le champ "Rang_Max" de la table "Dossiers".

    J'ai essayé ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    UPDATE	Dossiers
    SET	
    	Rang_Max = MAX(Relances.Rang)
    FROM Relances
    WHERE Dossiers.Code_Dossier = Relances.Code_Dossier
    J'obtiens l'erreur suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Msg 157, Level 15, State 1, Line 8
    Il manque un agrégat dans la liste de définition d'une instruction UPDATE.
    Une idée ?

    Merci d'avance

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 68
    Points : 40
    Points
    40
    Par défaut
    P.S. : Je viens de m'apercevoir que j'ai posté au niveau SQL Server au lieux de SQL Server Développement.
    Comme déplacer ou supprimer mon post ?

    Merci d'avance

  3. #3
    Membre habitué
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2007
    Messages : 141
    Points : 176
    Points
    176
    Par défaut
    Pouvez-vous essayer ceci ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    UPDATE	Dossiers
    SET	
    	Rang_Max = (SELECT MAX(Relances.Rang) FROM Relances WHERE Relances.Code_Dossier = Dossiers.Code_Dossier)
    FROM Relances, Dossiers
    WHERE Dossiers.Code_Dossier = Relances.Code_Dossier
    Alors, est-ce que c'est la meilleure façon de faire ? Peut-être pas, mais cela semble fonctionner

  4. #4
    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 : 42
    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
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    Malheureusement cela fonctionne mais votre requête spécifie une jointure triangulaire, c'est à dire que votre sous-requête est calculée pour chaque ligne à mettre à jour dans la table cible, Dossiers.
    Cela revient à exécuter du code procédural, ce pour quoi SQL Server n'est pas conçu (il se régale du code ensembliste )

    Sous SQL Server 2005, vous pouvez utiliser une CTE pour éviter ce désagrément :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    WITH
    	CTE_Relances (Code_Dossier, RangMax)AS
    	(
    		SELECT Code_Dossier, MAX(Rang)
    		FROM Relances R
    		JOIN Dossiers D ON D.Code_Dossier = R.Code_Dossier
    	)
    UPDATE Dossiers
    SET Rang_Max = CTE_Relances.RangMax
    FROM Dossiers D
    JOIN CTE_Relances C ON D.Code_Dossier = C.Code_Dossier
    ou encore une table dérivée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    UPDATE Dossiers
    SET Rang_Max = TMP.RangMax
    FROM Dossiers D
    JOIN (
    	SELECT Code_Dossier, MAX(Rang)
    	FROM Relances R
    	JOIN Dossiers D ON D.Code_Dossier = R.Code_Dossier
        ) TMP (Code_Dossier, RangMax) ON D.Code_Dossier = TMP.Code_Dossier

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 68
    Points : 40
    Points
    40
    Par défaut
    Merci à tous les deux

  6. #6
    Membre habitué
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2007
    Messages : 141
    Points : 176
    Points
    176
    Par défaut
    merci de cette précision Elsuket

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 05/01/2009, 16h12
  2. Problème de mise à jour de données avec IBClientDataset
    Par Papino dans le forum Bases de données
    Réponses: 6
    Dernier message: 26/09/2005, 14h04
  3. [2000 Server] Problème de mise à jour windowsupdate !!
    Par rohstev dans le forum Autres Logiciels
    Réponses: 8
    Dernier message: 24/08/2005, 15h03
  4. Problème de mise à jour de base de données
    Par poirier dans le forum ASP
    Réponses: 2
    Dernier message: 26/05/2004, 11h38
  5. problème de mise à jour de BD
    Par tidiane dans le forum Bases de données
    Réponses: 5
    Dernier message: 04/03/2004, 15h32

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