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écisions SGBD Discussion :

UPDATE sur la même table


Sujet :

Décisions SGBD

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 47
    Points : 35
    Points
    35
    Par défaut UPDATE sur la même table
    Bonjour,

    Une table ( IB 6.0 ) comporte une clé formée d'un identifiant ( ID ) et d'une date.
    Après chaque INSERT , je souhaite rajouter ( dans un champ DATE_PRECED ) pour chaque ID la date de l'enregistrement qui le précéde immédiatement dans le temps ( fonction MAX(date) < date de l'INSERT en cours).

    Je suis parvenu ( ouf ! ) à récupérer les dates en question dans un select:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    select  d1.dateseance  from "SEANCES" d, "SEANCES" d1
    where
    d.dateseance = '08/16/2005'
    and d.id = d1.id
    and d1.dateseance = (
    select max(dateseance) from "SEANCES"
    where d.id = id
    and dateseance < '08/16/2005')
    je ne parviens pas à mettre à jour les enregistrements insérés par un UPDATE des valeurs retournées !

    Question corrélée : est il possible de rapatrier 2 valeurs ( la date et le poids dans le cas précis ) en une seule requête ?

    Question subsidiaire : est il logique de réaliser cette opération systématique grâce à un trigger ?

    ... comme vous le constatez je suis proche du niveau zéro en SQL !

    Merci pour votre aide

  2. #2
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Points : 2 227
    Points
    2 227
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    UPDATE SEANCES d
    SET  datePrecedente = (SELECT MAX(dateseance) FROM SEANCES d1 WHERE d.id = d1.id AND d.dateseance > d1.dateseance  )
    Fonctionne sous ORACLE, mais pas avec tous les moteurs (normalement il est interdit d'aliasser la table principale d'un UPDATE)
    Question corrélée
    Je ne suis pas sur de comprendre la question, peut-être parles-tu des Row Value Constructor (aussi disponibles sous ORACLE)

    Question subsidiaire
    S'il s'agit de la mise à jour d'un datawarehouse, autant laisser l'ETL faire ce travail, sinon, demande-toi d'abord si cette dénormalisation est vraiment utile, et si oui, le TRIGGER est effectivement une solution.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 47
    Points : 35
    Points
    35
    Par défaut
    Merci de cette réponse rapide et... matinale !

    Je me suis peut être mal exprimé: il ne s'agit pas de rebalayer la table entiére pour remettre à jour TOUTES les lignes, mais seulement celle qui précéde ( chronologiquement ) celle qui vient d'être ajoutée.
    Le code suivant ( qui me paraît logique ... ) ne provoque pas d'erreur syntaxique, mais n'aboutit pas !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    UPDATE SEANCES D SET D.DATE_SEANCE_PREC =
     ( SELECT MAX(D1.DATESEANCE)
                           FROM "SEANCES" D1 , "SEANCES" D
                           WHERE D.ID = D1.ID
                           AND D.DATESEANCE = '08/16/2005'
                           AND D1.DATESEANCE < D.DATESEANCE
    )
    La question corrélée était de savoir si on peut par un seul UPDATE entre 2 tables mettre plusieurs valeurs à jour en une seule requête. ( dans le cas particulier la date de la seance précedente ET le poids de la séance précédente )

    Merci encore et bonne journée.

  4. #4
    Membre habitué

    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    175
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 175
    Points : 166
    Points
    166
    Par défaut
    Salut,

    peux-tu donner un exemple concret du contenu de ta table SEANCES
    avant et après l'INSERT d'un nouvel enregistrement ?

    Cet exemple nous permettra de comprendre ce que tu souhaites faire...

    @+

  5. #5
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 902
    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 902
    Points : 51 646
    Points
    51 646
    Billets dans le blog
    6
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    En gros si tu veut faire su chaînage temporel il faut le faire dans un trigger en pensant que si tu déplace une séance, il faudra reconstruire toute la chaîne.
     
    Exemple :
    NUM_SEANCE HEURE_SEANCE SEANCE_PRECEDENTE
    ------------ -------------- -----------------
    1 14h NULL
    2 16h15 1
    3 18h30 2
    4 21h 4
    5 20h 3
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     
    la dernière ligne est en erreur de saisie : il aurait fallu saisir 23h30 par exemple. mais le chaînage est bon.
    Lors de la correction d'horaire il faudra reprendre le chaînage pour toutes les séances à partrir de 20h.
     
    Il n'y a que par un trigger que cela est possible.
     
    A +

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 47
    Points : 35
    Points
    35
    Par défaut
    C'est la solution , qu'après quelques jours de vacances... , j'avais fini par adopter en créant une procédure stockée ( appelée par l'application frontale DELPHI ) .
    Le trigger est évidemment une solution bcp plus élégante que je vais mettre en oeuvre.
    Merci à tous d'accompagner la solitude du "développeur de fond" !

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

Discussions similaires

  1. Requête update avec un select sur la même table
    Par sheira dans le forum Requêtes
    Réponses: 6
    Dernier message: 15/09/2010, 16h09
  2. UPDATE selon un critère sur la même table
    Par CinePhil dans le forum Requêtes
    Réponses: 2
    Dernier message: 25/03/2008, 10h50
  3. UPDATE avec SELECT sur la même table
    Par Invité dans le forum Langage SQL
    Réponses: 7
    Dernier message: 07/12/2007, 03h39
  4. Update avec un select sur la même table
    Par Xunil dans le forum Administration
    Réponses: 5
    Dernier message: 09/04/2007, 16h40
  5. Réponses: 2
    Dernier message: 29/09/2004, 09h07

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