Précédent   Forum des professionnels en informatique > Bases de données > Décisions SGBD
Décisions SGBD Forum de décisions sur le choix en bases de données. Le Comparatif
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 17/08/2005, 23h11   #1
Candidat au titre de Membre du Club
 
Inscription : septembre 2004
Messages : 46
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 46
Points : 13
Points : 13
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 :
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
Papino est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/08/2005, 06h05   #2
Inactif
 
Avatar de Médiat
 
Inscription : décembre 2003
Messages : 1 946
Détails du profil
Informations forums :
Inscription : décembre 2003
Messages : 1 946
Points : 1 932
Points : 1 932
Code :
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)
Citation:
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)

Citation:
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.
Médiat est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/08/2005, 11h03   #3
Candidat au titre de Membre du Club
 
Inscription : septembre 2004
Messages : 46
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 46
Points : 13
Points : 13
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 :
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.
Papino est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/08/2005, 09h42   #4
Membre régulier
 
Inscription : juillet 2005
Messages : 175
Détails du profil
Informations forums :
Inscription : juillet 2005
Messages : 175
Points : 80
Points : 80
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...

@+
dcollart est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/09/2005, 19h05   #5
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 959
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 959
Points : 17 793
Points : 17 793
Code :
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 :
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 +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
SQLpro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/09/2005, 10h38   #6
Candidat au titre de Membre du Club
 
Inscription : septembre 2004
Messages : 46
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 46
Points : 13
Points : 13
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" !
Papino est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 16h58.


 
 
 
 
Partenaires

Hébergement Web