2013-07-17 12 views
0

Je veux mettre à jour ma table pour toutes les personnes dont l'activité a duré trop longtemps. La mise à jour devrait corriger une fois et pour les lignes suivantes je dois faire face à un nouveau résultat. Alors pensé à quelque chose commeInformix: UPDATE avec SELECT - syntaxe?

UPDATE summary_table st 
SET st.screen_on=newScreenOnValue 
    st.active_screen_on=st.active_screen_on-(st.screen_on-newScreenOnValue) --old-value minus thedifference 
FROM (
     SUB-SELECT with rowid, newScreenOnValue ... JOIN ... WHERE.... 
    ) nv 
WHERE (st.rowid=nv.rowid) 

Je sais que je peux mettre à jour la première et la seconde valeur directement, en réexécutant la même requête. Mais mon problème est que les coûts de la sous-sélection semblent assez élevés et que, par conséquent, vous voulez éviter une double mise à jour resp. double-course de la même requête.

Le SELECT ci-dessus est juste une manière informelle d'écrire ce que je pense que je voudrais obtenir. Je sais que le st ne fonctionne pas, mais je l'ai laissé ici pour une meilleure compréhension. Lorsque j'essaie l'instruction ci-dessus, je récupère toujours une SyntaxError à la position FROM.

Répondre

1

Ceci peut être réalisé comme suit:

UPDATE summary_table st 
SET (st.screen_on, st.active_screen_on) = 
    ((SELECT newScreenOnValue, st.active_screen_on-(st.screen_on-newScreenOnValue) 
    FROM ... 
    JOIN... 
    WHERE..)) 
[WHERE if any additional condition required]; 

La requête ci-dessus fonctionne parfaitement bien sur Informix essayé et testé jusqu'à ce que vous faites des erreurs dans la FROM, se joignent les clauses.

À la votre!

+0

Je n'ai pas pensé à ce genre de style. Merci, je vais essayer (même si j'ai trouvé une autre solution). – LeO

+0

Cela a-t-il fonctionné? –

+0

Pour être honnête: je n'ai pas essayé, mais la syntaxe semble très, très prometteuse. Par conséquent, je vais accepter la réponse. Je n'ai pas pensé à une variation de tuple ... – LeO

0
  1. Erreur de syntaxe car une virgule est manquante entre les première et deuxième colonnes que vous mettez à jour.

  2. N'utilisez jamais les ROWID, ils sont volatiles et ne sont pas utilisés par défaut avec IDS, sauf si vous le spécifiez.

  3. Pourquoi utilisez-vous une sous-requête?

+0

add1) bien, vous avez raison, mais l'erreur de syntaxe augmenterait déjà par le st, alors prenez-le comme une méta-formulation ce que je veux réaliser. add2) le rowid n'est pas la clé interne, mais une clé unique, utilisée dans différentes tables. add3) car la somme est calculée à partir d'une autre table, avec plusieurs dépendances. mais la somme pourrait être liée à une clé unique. Par conséquent je cherche la syntaxe appropriée d'une mise à jour – LeO