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

Développement SQL Server Discussion :

Requête mise à jour avec compteur incrémental (sans curseur)


Sujet :

Développement SQL Server

  1. #1
    FMJ
    FMJ est déconnecté
    Membre averti
    Profil pro
    tutu
    Inscrit en
    Octobre 2003
    Messages
    416
    Détails du profil
    Informations personnelles :
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : tutu

    Informations forums :
    Inscription : Octobre 2003
    Messages : 416
    Points : 356
    Points
    356
    Par défaut Requête mise à jour avec compteur incrémental (sans curseur)
    Bonjour,

    Dans le cadre d'une PS, je souhaiterais faire les choses un peu plus élégamment que d'habitude (ça sera aussi plus performant mais pour une centaine de lignes, la différence ne sera pas flagrante !) et passer par une requête au lieu d'un curseur.

    Je souhaite donc mettre à jour un certain nombre de lignes (qui seront triées selon un critère donné) dont la colonne mise à jour le sera en fonction d'un compteur incrémental (disons 1, 2, 3 ...).

    Je pensais à bêtement utiliser la technique de type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT @compteur=@compteur+1 FROM ...
    Dans le monde merveilleux du SQL, j'aurais bien aimé écrier un truc dans le style mais .... le monde n'est pas si merveilleux que ça !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    UPDATE TABLE1
    SET CHAMP1=@compteur
    FROM
    (SELECT CHAMP1, @compteur=@compteur+1 FROM MATABLE ORDER BY CHAMP1) AS TABLE1
    Auriez-vous un plus d'idée que moi ? Merci d'avance.

  2. #2
    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
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour

    Mais si, il est merveilleux :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    WITH CTE AS (
        SELECT Champ1,
               ROW_NUMBER() OVER(ORDER BY Champ1) AS RN
        FROM MaTable
    )
    UPDATE CTE
    SET Champ1 = RN

  3. #3
    FMJ
    FMJ est déconnecté
    Membre averti
    Profil pro
    tutu
    Inscrit en
    Octobre 2003
    Messages
    416
    Détails du profil
    Informations personnelles :
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : tutu

    Informations forums :
    Inscription : Octobre 2003
    Messages : 416
    Points : 356
    Points
    356
    Par défaut
    Salut

    Pas tant que ça : je suis sous SQL Server 2000 ...... Pas droit aux CTE snif !

    Merci pour ta réponse.

  4. #4
    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
    Points : 13 092
    Points
    13 092
    Par défaut
    arff, oui, moi je parlais du nouveau monde :d

    Bon alors, ça sera plutôt quelque chose comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    UPDATE MaTable T1
    SET Champ1 = (SELECT COUNT(*) FROM MaTable T2 WHERE T2.champ1 <= T1.Champ1)
    attention cela ne gère pas les cas où il peut y avoir plusieurs champ1 avec la même valeur

  5. #5
    FMJ
    FMJ est déconnecté
    Membre averti
    Profil pro
    tutu
    Inscrit en
    Octobre 2003
    Messages
    416
    Détails du profil
    Informations personnelles :
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : tutu

    Informations forums :
    Inscription : Octobre 2003
    Messages : 416
    Points : 356
    Points
    356
    Par défaut
    Oui exact. En l'adaptant un peu ça doit fonctionner.
    Et même si je pense devoir y introduire une autre sous-requête avec un ORDER, j'imagine que c'est tout de même bien plus rapide qu'avec un curseur ?

    Merci pour ta réponse. Les solutions simples sont toujours les meilleures.

  6. #6
    FMJ
    FMJ est déconnecté
    Membre averti
    Profil pro
    tutu
    Inscrit en
    Octobre 2003
    Messages
    416
    Détails du profil
    Informations personnelles :
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : tutu

    Informations forums :
    Inscription : Octobre 2003
    Messages : 416
    Points : 356
    Points
    356
    Par défaut
    Donc je confirme, ça apporte bien le résultat attendu, vu que le champ à mettre à jour est unique.
    Par contre, comme la table sur laquelle porte la requête est assez balèze en nombre de lignes et qu'elle est super mal optimisées au niveau des indexes (mais je ne peux pas y toucher), l'exécution en pure requêtage est plus lente qu'avec un curseur ..... Si si c'est possible, et pas d'un peu.
    Donc je vais revenir au curseur ... à regret.

    Merci de votre aide.

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

Discussions similaires

  1. [AC-2003] Requête Mise à jour avec Somme
    Par lio33 dans le forum Requêtes et SQL.
    Réponses: 7
    Dernier message: 16/09/2016, 15h54
  2. Requête INSERT avec compteur incrémental (sans curseur)
    Par FMJ dans le forum Développement
    Réponses: 10
    Dernier message: 04/01/2014, 12h03
  3. [AC-2007] requête mise à jour avec deux paramètres
    Par gerarddurand dans le forum Requêtes et SQL.
    Réponses: 8
    Dernier message: 15/01/2010, 11h07
  4. [AC-2003] Requête mise à jour avec condition IN
    Par buzz73 dans le forum VBA Access
    Réponses: 19
    Dernier message: 30/07/2009, 12h03
  5. Requête mise à jour avec jointure interne
    Par joquetino dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 16/01/2008, 17h41

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