更新 oracle table 引用更新的 table / 字段? (相关更新?)
Update oracle table referencing updated table / field? (Correlated update?)
我有一个任务管理器,它会在日志中删除一些信息 table 与此类似:
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
任务完成后,不会存储所有者。在代码中修复了它,但现在我想修复旧条目。
为此,对于每个拥有者为空的条目,我需要搜索倒数第二个条目以获取所有者,这将与关闭任务的人相同。
我正在尝试制定一种方法,似乎与此类似的方法可行:
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)
可能不优雅或高效,但似乎它可以工作,但是当我 运行 它时,我收到一个 ORA-00904: "t1"."processId" 无效标识符。
我认为不可能引用更新后的 table 标识符,但在查看 oracle 文档和一些帖子后,我发现 similar 更新应该有效。
可以参考一下吗?或者我必须完全改变进行此更新的方法?
有几种方法可以做到这一点(例如merge
)。但是用你的方法,你可以使用 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
);
我有一个任务管理器,它会在日志中删除一些信息 table 与此类似:
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
任务完成后,不会存储所有者。在代码中修复了它,但现在我想修复旧条目。
为此,对于每个拥有者为空的条目,我需要搜索倒数第二个条目以获取所有者,这将与关闭任务的人相同。
我正在尝试制定一种方法,似乎与此类似的方法可行:
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)
可能不优雅或高效,但似乎它可以工作,但是当我 运行 它时,我收到一个 ORA-00904: "t1"."processId" 无效标识符。
我认为不可能引用更新后的 table 标识符,但在查看 oracle 文档和一些帖子后,我发现 similar 更新应该有效。
可以参考一下吗?或者我必须完全改变进行此更新的方法?
有几种方法可以做到这一点(例如merge
)。但是用你的方法,你可以使用 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
);