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 :

update, une boucle obligatoire?


Sujet :

Langage SQL

  1. #1
    Membre émérite Avatar de franculo_caoulene
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 880
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 880
    Points : 2 953
    Points
    2 953
    Par défaut update, une boucle obligatoire?
    Salut,

    J'expose d'abord ce que j'ai pour ensuite exposer ce que je souhaite obtenir.
    J'ai une table PROFIL contenant une colonne POIDS :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    POIDS
    -----
    a
    b
    c
    d
    e
    f
    g
    h
    i
    J'en tire un jeu de poids suivant une condition "différent de g, h ou i"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select distinct POIDS 
    into #tmp
    from PROFIL 
    where isnull(POIDS, '')<>'' 
    and charindex(POIDS, 'ghi')=0
    Ceci me retournant bien une table #tmp contenant a, b, c, d, e et f.
    Je souhaite ensuite parcourir une table DROIT :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    ID_DROIT    POIDS   
    ----------- ----------
    droit1      i       
    droit2      abcdfghie 
    droit3      acdefghi  
    droit4      
    droit5               
    droit6      abcdefghi
    Afin d'en supprimer tout droit n'étant pas g, h ou i. D'où ma table #tmp retournant tous les autres droits.

    Mon souci est que je fais un update pour supprimer ces droits :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    update top(10) DROIT
    set POIDS = replace(d.POIDS, t.POIDS, '')
    from DROIT d
    join #tmp t on d.POIDS like '%'+ t.POIDS +'%'
    and isnull(d.POIDS, '') <> ''
    qui me supprime qu'un seul poids à la fois. Si je l'exécute une fois j'obtiens dans ma table droit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    ID_DROIT    POIDS   
    ----------- ----------
    droit1      i       
    droit2      bcdfghie 
    droit3      cdefghi  
    droit4      
    droit5               
    droit6      bcdefghi
    ou je souhaiterais obtenir, si possible sans faire de boucle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    ID_DROIT    POIDS   
    ----------- ----------
    droit1      i       
    droit2      ghi 
    droit3      ghi  
    droit4      
    droit5               
    droit6      ghi
    Savez-vous si c'est possible sans boucler? Si oui, comment faire?

    Merci par avance.
    Les Cours et tutoriels JavaScript
    Penser à la recherche et au bouton

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 837
    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 837
    Points : 52 930
    Points
    52 930
    Billets dans le blog
    5
    Par défaut
    Votre base n'étant pas normalisée les requêtes seront toujours pourriées.

    Il existe bien évidemment une solution en une seule requête, faisant appel à des objets à rajouter à votre base.

    Pour cela il faut :
    1) une table des nombres remplis
    2) une tables des poids unitaires
    Ensuite la requête consiste à faire un cross join d'un côté et filtrage par substring ou autre de l'autre.

    Comme vous n'avez pas respecté la charte de postage il est difficile de vous en dire plus...
    http://www.developpez.net/forums/ann....php?f=37&a=69

    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/ * * * * *

Discussions similaires

  1. [MySQL] Exécuter une requête UPDATE dans une boucle
    Par vacknov dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 24/10/2008, 17h46
  2. Update dans une boucle avec valeur incrémentale
    Par framus.class dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 24/09/2008, 11h19
  3. Syntaxe pour un update dans une boucle ..
    Par fmoriet dans le forum SQL Procédural
    Réponses: 0
    Dernier message: 15/11/2007, 09h55
  4. Réponses: 13
    Dernier message: 20/03/2006, 16h26
  5. Réponses: 2
    Dernier message: 02/12/2005, 13h12

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