2017-05-11 4 views
0

J'ai un gestionnaire de tâches qui tombe quelques informations dans une table de journal simmilar à ceci:Mise à jour de la table Oracle référençant la table/le champ mis à jour? (? Mise à jour Corrélée)

processId owner  state   state_date 
------------------------------------------------------------ 

1-88D6PJ  group1  OPENED   14/08/2013 14:57:44 
1-88D6PJ  group2  ASSIGNED   14/08/2013 14:58:36 
1-88D6PJ  group3  ASSIGNED   15/08/2013 11:26:45 
1-88D6PJ  group2  ASSIGNED   17/08/2013 17:20:13 
1-88D6PJ  group3  ASSIGNED   19/08/2013 09:05:12 
1-88D6PJ  null  FINISHED   22/08/2013 12:13:59 

Lorsqu'une tâche est terminée, le propriétaire ne sont pas stockées. Je l'ai corrigé dans le code, mais maintenant je voudrais corriger les anciennes entrées. Pour ce faire, pour chaque entrée avec le propriétaire null, j'ai besoin de rechercher l'entrée pénultième pour prendre le propriétaire, qui sera le même qui ferme la tâche.

Je tentais de faire une approche, et semble que quelque chose du même type que cela pourrait fonctionner:

UPDATE tasks.tasks_log t1 
    set (t1.owner) = 
     (SELECT owner 
      FROM (SELECT owner 
        FROM tasks.tasks_log t2 
       WHERE t1.processId = ep2.processId 
        and state not in ('FINISHED', 'CANCELLED') 
        and state_date is not null 
       ORDER BY state_date DESC) 
     WHERE rownum = 1) 

Peut-être pas élégant ou efficcient, mais il semble qu'il pourrait fonctionner, mais quand je le lance, je reçois un ORA -00904: "t1". "ProcessId" identificateur invalide.

Je suppose qu'il n'est pas possible de faire référence à l'identificateur de table mis à jour, mais après avoir vérifié la documentation de l'oracle et certains messages, je vois similar mises à jour supposé fonctionner.

Est-il possible de faire cette référence? ou je dois totalement changer l'approche pour faire cette mise à jour?

Répondre

1

Il existe plusieurs façons de le faire (par exemple merge). Mais avec votre approche, vous pouvez utiliser keep:

UPDATE tasks.tasks_log t1 
    set (t1.owner) = (SELECT MAX(t2.owner) KEEP (FIRST DENSE_RANK ORDER BY BY state_date DESC) 
        FROM tasks.tasks_log t2 
        WHERE t1.processId = ep2.processId AND 
          t2.state not in ('FINISHED', 'CANCELLED') AND 
          t2.state_date is not null 
        ); 
+0

Merci beaucoup. J'ai bien travaillé, et j'ai appris un peu plus car c'est la première fois que je vois ça. – Mortuk