2010-06-21 8 views
2

INFORMIX-SE 7.32:Erreur 360: Impossible de modifier la table ou vue utilisée dans la sous-requête

Je reçois l'erreur 360 lorsque je tente d'exécuter l'instruction suivante:

update transaction 
    set transaction.colx = (select tab1.cola from tab1) 
where transaction.num = (select max(transaction.num) from transaction) 
    and transaction.colx IS NULL; 

Toutes les idées?

+0

Pourquoi les balises Oracle et MySQL pour cette question spécifique à Informix? –

+1

@ Tony- parce que l'instruction de mise à jour SQL elle-même ne contient pas de supersets spécifiques à INFORMIX et peut-être qu'un programmeur expérimenté Oracle ou MySQL pourrait répondre à la question (plus d'audience). –

+2

Mais l'erreur est une erreur Informix, et Oracle ne soulèverait aucune erreur pour ce SQL, cela fonctionnerait très bien. –

Répondre

4

Vous essayez de UPDATE la table transaction et lire de la même table en utilisant SELECT MAX avec la même question. Tu ne peux pas faire ça.

Subquery restrictions

En général, vous ne pouvez pas modifier une table et sélectionnez la même table dans une sous-requête. Par exemple, cette limitation s'applique aux déclarations des formes suivantes:
DELETE FROM t WHERE ... (SELECT ... FROM t ...);
UPDATE t ... WHERE col = (SELECT ... FROM t ...);
{INSERT|REPLACE} INTO t (SELECT ... FROM t ...);

+0

Alors existe-t-il une méthode alternative pour localiser le max (transaction.num) afin de le mettre à jour? –

+3

@Frank Pourquoi n'exécutez-vous pas 'select max (transaction.num) à partir de la transaction?) Et utilisez la valeur dans la requête. – Amarghosh

+1

@Frank: Amarghosh est correct - il y a des limitations dans SE qui ne sont pas présentes dans IDS et d'autres SGBD plus modernes et capables, et c'est l'un d'entre eux. Avec IDS, vous pouvez utiliser une SEQUENCE. Avec SE, vous pouvez créer une table temporaire à une ligne pour contenir le maximum et l'utiliser dans l'instruction UPDATE. Si, d'après ce que je comprends d'autres questions, vous travaillez principalement avec un système à utilisateur unique, ce qui sera assez sûr. Si vous aviez affaire à un système multi-utilisateur (comme la plupart des gens le doivent), vous devriez être beaucoup plus inquiet au sujet de la fenêtre TOCTOU (temps de vérification, heure d'utilisation) pour un changement. –