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

Langage SQL Discussion :

[SQL server] Probleme de requete Update : compteur tous les 15.000 lignes


Sujet :

Langage SQL

  1. #1
    Candidat au Club
    Inscrit en
    Août 2006
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 5
    Points : 2
    Points
    2
    Par défaut [SQL server] Probleme de requete Update : compteur tous les 15.000 lignes
    Salut,

    j'ai un probleme avec une requete (SQL server)

    Juste avant cette requete tout mes champs counter sont à 0, le but est de les passer par blocs N a une valeur (que j'incremente tout les 15000) (pour pouvoir ensuite faire un simple group by COUNTER pour retrouver mes 15000 enregistrement à coups sur) J'espere avoir été clair (ce qui n'est pas toujours le cas)
    grossomodo je veut faire un champ qui s'autoincrement tout les 15000 enregistrements

    Voila ma requete (un essai je suis en cours de test ca marche pas)
    UPDATE MM_LIGNE4 SET COUNTER = ( SELECT MAX(COUNTER)+1 FROM MM_LIGNE4 GROUP BY COUNTER HAVING COUNT(*)=15000) WHERE EXISTS ( SELECT top 15000 * FROM MM_LIGNE4 WHERE COUNTER = 0 )

    Bref si quelqu'un voit comment résoudre ce probleme via (ou ce qui cloche dans ma requete)

    Merci,
    ++

  2. #2
    Membre habitué Avatar de petit arbre
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    143
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 143
    Points : 153
    Points
    153
    Par défaut
    déjà je vois (rapidement) un problème, tu mets un champ Counter à jour à partir d'un calcul sur le même champ.
    Il vaudrait mieux créer un nouveau champ de "rupture?", je ne vois pas trop à quoi il sert ?

    Ensuite, tu peux faire la mise à jour du champ "rupture" par rapport au champ "counter" par un simple calcul de division du style :

    rupture = int((counter-1)/15000) + 1

    Enfin, je ne sais pas si je suis très clair ....

  3. #3
    Candidat au Club
    Inscrit en
    Août 2006
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    salut,

    Non en fait j'ai pas tres bien compris mais j'ai du mal m'exprimer... (c'est de ma faute aussi )

    Bon l'errreru dans la requete je m'en suis appercu depuis

    Mon but est synthétiquement

    On regarde dans la table si ya des enregistrement ou COUNTER =0
    SI OUI
    on en prend 15000 on les met à la valeur maximale de counter + 1
    SINON
    On fait rien
    FIN-SI

    Ce fera que je pourrai classer mes enregistrement par bloc de 15 000 grace a un group by sur le champ COUNTER et faire le reste de mon souk trankilou
    Donc mon but est de faire ca avec le moins de code possible... donc en utilisant a fond le SQL

    Au niveau de ma requete la je suis en train de tester ca qui a pas l'air de marcher tres bien :

    UPDATE %Table(MM_LIGNE)
    SET COUNTER = 1
    WHERE EXISTS (
    SELECT top 15000 *
    FROM %Table(MM_LIGNE)
    WHERE COUNTER = '0' )

    Comme tout mes COUNTER sont à 0 je devrai apres en avoior 15000 à 1 mais ca veut pas ca met tout a 1

  4. #4
    Membre habitué Avatar de petit arbre
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    143
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 143
    Points : 153
    Points
    153
    Par défaut
    effectivement ça doit mettre à 1 !!


    essayes pour voir ceci :

    update matable set counter = int((counter-1)/15000) + 1


    int est la fonction integer ou partie entiere, je ne connais pas sa syntaxe exacte sous sqlserver ..

  5. #5
    Candidat au Club
    Inscrit en
    Août 2006
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    ca donne ca :
    update matable set counter = FLOOR((counter-1)/15000) + 1

    J'y avais bien pensé mais ma colonne COUNTER n'est pas incrémenter à la basse ya que des "0" dedans en bref ta solution me ramene toujours 0 bref ca marche toujours pas
    faudrait que j'incremente ma table avant en insert ...

    Je fait ca juste avant si ca peut t'aider ou te donner des idées insert into matable select *,'0' from OtherTable

    Le '0' représentant le champ COUNTER


    ------------------------------------------------

    Autrement pour ma requete, je ne comprend pas
    quelle mette a jour toute la table puisque je fait une sélection des 15000 premiers enregistrement!!!!
    UPDATE %Table(MM_LIGNE)
    SET COUNTER = 1
    WHERE EXISTS (
    SELECT top 15000 *
    FROM %Table(MM_LIGNE)
    WHERE COUNTER = '0' )

  6. #6
    Membre habitué Avatar de petit arbre
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    143
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 143
    Points : 153
    Points
    153
    Par défaut
    pour ta requête, il faudrait que je l'essaye et j'ai pas de base sous la main en ce moment, je change toutes mes versions de BDD et j'ai un pc vierge !!


    Sinon, pour finir de résoudre ton problème : avant de lancer le update dont on vient de parler, il faut que tu aies un chrono séquentiel dans ton champ counter.

    S'il y a des séquences sous Sql Server, tu pourrais mettre le champ à jour à partir de ça.

  7. #7
    Candidat au Club
    Inscrit en
    Août 2006
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Apperrement il y a moyen de chopper le numéro de ligne je sais pas encore comment mais ca va venir...

    Un chrono séquentiel ???!!!! c'est quoi ca je vais me renseigner (enfin demain parceque la .... )

  8. #8
    Candidat au Club
    Inscrit en
    Août 2006
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Voila je me suis dépatouiller

    donc ma solution malheureusement j'ai une boucle (j'aurai pu creer une colonne autoincrementer ca m'aurait poser moins de soucis )

    donc dans ma boucle (je ré-execute la requete à chaque coup)


    tant que j'ai un résultat sur ma requete suivante
    select top 1 'X' from MM_LIGNE where COUNTER = '0'
    alors je fait :
    SET ROWCOUNT 15000;

    UPDATE MM_LIGNE
    SET COUNTER = (SELECT MAX(COUNTER)+1 FROM MM_LIGNE)
    WHERE COUNTER = '0';

    SET ROWCOUNT 0;


    Donc à la fin mes blocs sont séparé par 15000, c'est pas optimale mais ca marche

    merci de ton aide petit arbre

    PS: pour ceux qui ne savent pas

    SET ROWCOUNT n; limite le nombre de résultat des requetes qui suivent au nombre n indiqué apres
    SET ROWCOUNT 0; met la limite de ligne à l'infini

  9. #9
    Membre habitué Avatar de petit arbre
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    143
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 143
    Points : 153
    Points
    153
    Par défaut
    Effectivement c'est une solution, le principal étant que ça fonctionne..

    bon dév, a+

  10. #10
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 761
    Points : 52 547
    Points
    52 547
    Billets dans le blog
    5
    Par défaut
    Avec SQL Server 2005 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    UPDATE TOP 15000 MM_LIGNE
    SET COUNTER = (SELECT MAX(COUNTER)+1 FROM MM_LIGNE) 
    WHERE COUNTER = '0'
    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

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

Discussions similaires

  1. Changer le nom d'une table sur SQL server avec une requete
    Par Oluha dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 01/02/2014, 23h35
  2. Probleme de requete qui affiche tous les champs des tables
    Par sebing dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 25/03/2011, 13h57
  3. [SQL Server 2000] UPDATE sur tous les champs de ma table
    Par neeux dans le forum Langage SQL
    Réponses: 8
    Dernier message: 11/12/2006, 10h13
  4. Probleme de requete UPDATE pour modifier de champs ds DBGRID
    Par cmoimeme dans le forum Bases de données
    Réponses: 26
    Dernier message: 06/12/2005, 12h56
  5. SQL server 7.0 requete select
    Par sangokus dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 10/03/2004, 11h09

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