[postgreSQL8.2] Update multi-tables

Update multi-tables [postgreSQL8.2] - SQL/NoSQL - Programmation

Marsh Posté le 21-06-2007 à 14:25:29    

Salut,
 
J'introduis le support de PostgreSQL sur une application qui tourne initialement avec MySQL
 
j'ai la requête suivante, pour MySQL :

Code :
  1. UPDATE sdi_info, sdi_value SET sdii_statut='E', sdiv_statut='E' WHERE sdii_theme=6 AND sdiv_sdi_info=sdii_id;


 
Il est possible de faire 2 requêtes, mais je voudrai la porter sous cette forme condensée, sous PostgreSQL.
Vous avez une idée?
 
merci  [:john keats]


---------------
from here and there -- \o__________________________________ -- la révolution de la terre, en silence
Reply

Marsh Posté le 21-06-2007 à 14:25:29   

Reply

Marsh Posté le 21-06-2007 à 16:44:37    

1/ Ca me semble étrange d'avoir la même propriété à deux niveaux distincts d'une arborescence.
2/ C'est faisable avec trigger si la règle "les fils prennent la même valeur que celle du père si ce dernier change de valeur" est systématiquement vérifiée

Reply

Marsh Posté le 22-06-2007 à 13:11:26    


aucun  ;)  
 
je me renseigne  [:john keats]


---------------
from here and there -- \o__________________________________ -- la révolution de la terre, en silence
Reply

Marsh Posté le 22-06-2007 à 14:59:16    


 
 ca m'est assez familier [:john keats]  
 
 
[:itm]


---------------
from here and there -- \o__________________________________ -- la révolution de la terre, en silence
Reply

Marsh Posté le 22-06-2007 à 15:04:27    

un trigger est effectivement une procédure qui va s'exécuter au moment où on fait certaines actions dans la base.
 
les performances sont au contraire très bonnes, à condition de ne pas en abuser.
 
a noter qu'un trigger  s'effectue dans une micro transaction, ce qui permet de garantir que tout s'est bien passé à la fois pour la requête qui l'a déclenché, tout comme l'intégralité des actions qu'il aura initié, et ceci dès la fin de la requête initiale : c'est donc insécable

Reply

Marsh Posté le 25-06-2007 à 12:52:48    

salut, j'ai un autre petit souci .....  [:john keats]  
 

Code :
  1. SELECT I.sdii_name, V.sdiv_id, I.sdii_id, I.sdii_frequency, MAX( sdiv_date_published ) AS datep,
  2. COUNT( sdiv_date_published ) , S.scale_denomination, S.scale_id
  3. FROM sdi_value AS V
  4. LEFT OUTER JOIN sdi_info AS I ON V.sdiv_sdi_info = I.sdii_id
  5. LEFT OUTER JOIN scale AS S ON V.sdiv_scale = S.scale_id
  6. WHERE sdiv_statut <> 'E' AND sdii_statut <> 'E' AND I.sdii_frequency<>0
  7. AND S.scale_statut <> 'E' GROUP BY I.sdii_name, S.scale_denomination, V.sdiv_id, I.sdii_id, I.sdii_frequency, S.scale_id
  8. HAVING (MAX(V.sdiv_date_published) + interval '6 day') < NOW()ORDER BY S.scale_id;


 
Ceci fonctionne correctement ...
Mais je veux que l'intervale soit dynamique, issu d'un champs de la table.
 

Code :
  1. SELECT I.sdii_name, V.sdiv_id, I.sdii_id, I.sdii_frequency, MAX( sdiv_date_published ) AS datep,
  2. COUNT( sdiv_date_published ) , S.scale_denomination, S.scale_id
  3. FROM sdi_value AS V
  4. LEFT OUTER JOIN sdi_info AS I ON V.sdiv_sdi_info = I.sdii_id
  5. LEFT OUTER JOIN scale AS S ON V.sdiv_scale = S.scale_id
  6. WHERE sdiv_statut <> 'E' AND sdii_statut <> 'E' AND I.sdii_frequency<>0
  7. AND S.scale_statut <> 'E' GROUP BY I.sdii_name, S.scale_denomination, V.sdiv_id, I.sdii_id, I.sdii_frequency, S.scale_id
  8. HAVING (MAX(V.sdiv_date_published) + interval I.sdii_frequency) < NOW()ORDER BY S.scale_id;


 
et la, ca fonctionne, plus ... j'ai essayé un ajoutant des simples quotes, doubles quotes .. marche pas! ..  
 
 
j'ai aussi essayé la concatention .... :

Code :
  1. + interval I.sdii_frequency || ' day'


 
pas mieux  
 
 
une idée? merci  [:john keats]  


---------------
from here and there -- \o__________________________________ -- la révolution de la terre, en silence
Reply

Marsh Posté le 25-06-2007 à 14:25:52    

I.sdii_frequency renvoie un entier que je concatene a day pour gerer mon interval.... peut-etre qu'il faut echapper ou faire un truc spécial avec le nom du champ mais je ne vois pas quoi ....


---------------
from here and there -- \o__________________________________ -- la révolution de la terre, en silence
Reply

Marsh Posté le 25-06-2007 à 14:57:47    

nan, ca n'a pas d'importance...  
 
Je peux le gérer en PHP mais c'est possible de le faire avec la syntaxe SQL et c'est plus propre ... c'est un truc tout con .... quelqu'un ici doit savoir ca! :D
 
enfin merci, hein!!


---------------
from here and there -- \o__________________________________ -- la révolution de la terre, en silence
Reply

Marsh Posté le 25-06-2007 à 16:00:33    

simogeo a écrit :

Salut,
 
J'introduis le support de PostgreSQL sur une application qui tourne initialement avec MySQL
 
j'ai la requête suivante, pour MySQL :

Code :
  1. UPDATE sdi_info, sdi_value SET sdii_statut='E', sdiv_statut='E' WHERE sdii_theme=6 AND sdiv_sdi_info=sdii_id;


 
Il est possible de faire 2 requêtes, mais je voudrai la porter sous cette forme condensée, sous PostgreSQL.
Vous avez une idée?
 
merci  [:john keats]

fais une transaction quand même. c'est du SQL standard ça d'ailleurs ?

Reply

Marsh Posté le 25-06-2007 à 16:04:53    

simogeo a écrit :

I.sdii_frequency renvoie un entier que je concatene a day pour gerer mon interval.... peut-etre qu'il faut echapper ou faire un truc spécial avec le nom du champ mais je ne vois pas quoi ....


* interval '1 day'
 
MAX(V.sdiv_date_published) + I.sdii_frequency * interval '1 day'

Reply

Marsh Posté le 25-06-2007 à 16:04:53   

Reply

Marsh Posté le 26-06-2007 à 14:40:36    

Taz a écrit :

fais une transaction quand même. c'est du SQL standard ça d'ailleurs ?


 
je pense pas non .... C'est MySQL compliant  [:john keats] . Mais j'ai décidé de scinder les requetes
 

Taz a écrit :

* interval '1 day'
 
MAX(V.sdiv_date_published) + I.sdii_frequency * interval '1 day'


 
ca fonctionne  [:cyriadis] . Merci  [:john keats]  


---------------
from here and there -- \o__________________________________ -- la révolution de la terre, en silence
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed