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 :

peut-on faire un update en fonction de la ligne précédente?


Sujet :

Développement SQL Server

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    683
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 683
    Points : 237
    Points
    237
    Par défaut peut-on faire un update en fonction de la ligne précédente?
    Bonjour,

    J'ai une table du genre : sous SQL 2000
    date - compte - tiers - solde
    200108 411000 TOTO 6000
    200108 413000 6000
    150108 411000 DUPOND 5000
    150108 413000 5000
    151108 471000 2000
    151108 413000 2000

    Je voudrais lire la table si je vois 411000, je copie le champs tiers et l'update sur la seconde ligne dans le même champs seulement si cette seconde ligne contient 413000


    Pour obtenir :
    200108 411000 TOTO 6000
    200108 413000 TOTO 6000
    150108 411000 DUPOND 5000
    150108 413000 DUPOND 5000
    151108 471000 2000
    151108 413000 2000

    Savez-vous si c'est possible ?

    Thibault

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 59
    Points : 55
    Points
    55
    Par défaut
    Tu peux faire comme ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    UPDATE TaTable SET
    	TaTable.tiers = (SELECT t2.tiers FROM TaTable AS t2 WHERE t2.id = TaTable.id-1 )
     WHERE TaTable.compte = 413000
     AND (SELECT compte FROM TaTable AS t3 WHERE t3.id = TaTable.id-1) = 411000
    J'ai pas testé mais je suis convaincu que ça fera l'affaire, cette requête update le champ tiers si son champ compte est égal à 413000 et si le champ compte de la ligne précédente est égal ) 411000. Seul problème c'est que ça utilise l'indispensable id que je n'ai pas vu dans ta structure, il faudrait peut-être penser à les rajouter pour avoir une table propre...

  3. #3
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 736
    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 736
    Points : 52 447
    Points
    52 447
    Billets dans le blog
    5
    Par défaut
    Il n'existe AUCUNE NOTION D'ORDRE dans une base de données : ni ordre des lignes, ni ordre des tables, ni ordre des colonnes. Supposer un ordre implicite quelconque dans une SGBDR qui fonctionne de manière ensembliste est aussi catastrophique que de supposer qu'avec des chaussures de tennis on va marcher sur l'eau.

    Vous devez baser votre logique sur des données fonctionnelles et non sur de la cosmétique.

    Lisez ce que j'ai écrit à ce sujet :
    http://sqlpro.developpez.com/cours/sqlaz/erreurs/#L6
    http://blog.developpez.com/sqlpro?ti..._sont_des_ense

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

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 59
    Points : 55
    Points
    55
    Par défaut
    j'ai lu tes articles et je comprend ce que tu veux dire mais en mettant un ORDER BY sur un id auto incrémenté ça contourne le problème non?

    [edit]après réfléxion un ORDER BY sur n'importe quel champ fait très bien l'affaire, les données sortirons tjs dans le bon ordre...[/edit]

    dsl tibofo pour le petit hors sujet mais je suis curieux de savoir la réponse :p

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    683
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 683
    Points : 237
    Points
    237
    Par défaut
    Merci KYYAN et SQLPRO

    je n'ai aps encore testé la soluce de KYYAN à cause de la remarque de SQLPRO (mais je vais la tester)

    SQLPRO, veux-tu dire que la soluce de kyyan est fausse ?

    en tout cas, j'ai bien aimé l'image du sac de billes ... qui est d'une clarté !!

  6. #6
    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,

    N'écrivez pas vos requêtes de cette façon, cela revient à écrire un curseur, et c'est ce qu'on appelle RBAR (Row By Agonizing Row), et dans votre cas, une jointure triangulaire : pour chaque ligne de votre requête, vous recalculez la sous requête corrélée.
    C'est certes facile à comprendre, mais c'est très contre-performant ...

    Néanmoins, n'était-ce pas plus facile d'écrire votre requête de façon ensembliste :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    UPDATE maTable
    SET tiers = TMP.tiers
    FROM maTable T
    JOIN (
    	SELECT tiers
    	FROM maTable
    	WHERE tiers IS NULL
    	AND compte = 413000
    	) TMP ON TMP.tiers = T.tiers
    WHERE compte = 411000
    On est en plus obligés de faire une jointure sur des chaînes de caractère, c'est à dire ce qu'il y a de pire, en espérant que vous n'avez pas choisi une collation insensible à la casse

    Si vous aviez formulé votre problème en français, vous auriez trouvé l'expression de la requête que je vous propose. Prenez 2 minutes pour vous concentrer sur le problème à résoudre, la solution vous viendra toute seule !

    @++

Discussions similaires

  1. La fonction imread peut-elle faire du multilayer?
    Par Invité dans le forum MATLAB
    Réponses: 2
    Dernier message: 12/02/2014, 16h36
  2. Réponses: 13
    Dernier message: 24/09/2010, 23h07
  3. Peut-on faire une liste de fonctions en Java?
    Par stof dans le forum Général Java
    Réponses: 12
    Dernier message: 17/04/2010, 07h55
  4. [XL-2003] Peut-on faire un update de table sur une connexion ODBC avec Excel ?
    Par tibofo dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 04/11/2009, 19h12
  5. Comment faire un Timer de fonction PORTABLE ?
    Par dieuP1guin dans le forum C
    Réponses: 3
    Dernier message: 04/07/2003, 11h44

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