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 min ?


Sujet :

MS SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Septembre 2006
    Messages
    104
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 104
    Par défaut Update avec min ?
    Bonjour.

    Je suis sous SQL Server 2005 et je souhaiterais faire un update d'une table comme suit:

    la table:
    id;idDetail;nb
    2;3;
    2;2;
    2;5;
    1;1;
    1;2;
    1;3;
    5;5;
    5;4;
    5;3;

    Je souhaiterais faire un update de cette table et affecter le champ "nb" à 1 pour caque couple id+min(idDetail), 0 dans le cas contraire

    soit ici:
    id;idDetail;nb
    2;3;0
    2;2;1
    2;5;0
    1;1;1
    1;2;0
    1;3;0
    5;5;0
    5;4;0
    5;3;1

    Pour n'avoir que les lignes qui m’intéresse sur un select je fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    select id, min(idDetail)
    from maTable
    group by id, idDetail
    Mais comment faire l'update?

    Merci.

  2. #2
    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
    Comme ceci par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    With MT (id, IdDetail_min) as
    (
      select id, min(IdDetail)
        from MaTable
    group by id
    )
    update mt1
       set nb = case mt1.IdDetail when MT.IdDetail_min then 1 else 0 end
      from MaTable as mt1
           inner join MT
             on MT.id = mt1.id

  3. #3
    Membre confirmé
    Inscrit en
    Septembre 2006
    Messages
    104
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 104
    Par défaut
    Merci Waldar pour cette très rapide réponse qui fonctionne très bien 19s pour 2 Millions de ligne et 1M de ligne maj.

    Il faut vraiment que je boss sur l'instruction With!

    Cordialement.

  4. #4
    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
    J'ai fait une correction du code, la jointure externe n'est pas nécessaire.
    Par contre, si votre table fait deux millions de lignes, il aurait du y avoir deux millions de mises à jour, n'ayant posé aucun filtre.

  5. #5
    Membre confirmé
    Inscrit en
    Septembre 2006
    Messages
    104
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 104
    Par défaut
    C'est moi qui ai ajouté une condition pour adapter à mes besoins.

    J'ai remplacer par le inner join, résultat 14s.

    Merci.

  6. #6
    Membre confirmé
    Inscrit en
    Septembre 2006
    Messages
    104
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 104
    Par défaut
    Bonjour.

    Pouvez-vous me dire quel est la différence entre l'utilisation du WITH et d'une table temporaire?
    ex:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT id, min(IdDetail) as IdDetail_min
    INTO #MT
    FROM MaTable
    GROUP BY id
     
    UPDATE mt1
       SET nb = case mt1.IdDetail when #MT.IdDetail_min then 1 else 0 end
      FROM MaTable AS mt1
           INNER JOIN #MT
             ON #MT.id = mt1.id
    Merci pour vos lumières.

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

Discussions similaires

  1. Update avec MIN() conditionnel
    Par ctiguidou dans le forum SQL
    Réponses: 17
    Dernier message: 28/06/2012, 15h43
  2. UPDATE avec des variables Delphi ...
    Par Kokito dans le forum Bases de données
    Réponses: 3
    Dernier message: 08/03/2004, 22h35
  3. Requete d'update avec concatenation !!
    Par chris92 dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 25/02/2004, 12h05
  4. [version] Requete Update avec différentes versions de mySQL
    Par regbegpower dans le forum Requêtes
    Réponses: 2
    Dernier message: 26/01/2004, 17h19
  5. Pb Update avec chaine de caractere
    Par JuJu° dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 28/05/2003, 15h58

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