0

我想通过引用它自己的行中的值以及它在同一个表中的父记录来更新一个表。

我有一个名为 import 的表,如果当前设置为 0 并且父项不是 0,则它需要将子记录的 chain_id 更新为其父记录的 chain_id。如果操作为 3,也将子记录状态设置为 1,否则离开它照原样,并将父状态设置为0。

这是一些非工作代码,说明了我正在尝试做的事情:

update 
(
select
c.chain_id as c_chain_id,
c.status as c_status,
c.action as c_action,
p.chain_id as p_chain_id,
p.status as p_status
from import c
join import p on c.original_dissemination_id = p.dissemination_id
where c.chain_id = 0 and
p.chain_id <> 0 and
)
set
c_chain_id = p_chain_id,
c_status = (if c_action = 3 then return 1 else c_status), /* 3 if action = 1 else leave it as it was */
p_status = 0

有人可以将以上内容翻译成一些有效的 oracle 代码吗?谢谢

4

2 回答 2

0

您是否尝试使用分层查询来修复它?

请参阅此示例:

   http://docs.oracle.com/cd/B19306_01/server.102/b14200/queries003.htm

问候和好运

于 2013-10-21T16:16:24.970 回答
0

我看到的问题是你想要同时更新 preform 2。实际上,您拥有的是两个具有层次关系的表 c 和 p。我不知道 oracle 中的 sql 唯一方法可以一次更新 2 个表。您可以使用视图和一些非常花哨的 SQL 来做一些技巧。

然而,花哨并不总是最好的解决方案。

我建议使用一点 pl/sql,例如

BEGIN
  FOR v_rec IN (SELECT c.chain_id AS c_chain_id,
                     c.status AS c_status,
                     c.action AS c_action,
                     p.chain_id AS p_chain_id,
                     p.status AS p_status,
                     c.dissemination_id AS c_dissemination_id,
                     p.dissemination_id AS p_dissemination_id
                FROM import c
                JOIN import p ON c.original_dissemination_id = p.dissemination_id
               WHERE c.chain_id = 0
                 AND p.chain_id <> 0) LOOP

    UPDATE import
       SET chain_id = v_rec.p_chain_id,
           status = decode(v_rec.c_action, 3, 1, status)
     WHERE dissemination_id = v_rec.c_dissemination_id;

    UPDATE import
       SET chain_id = 0
     WHERE dissemination_id = v_rec.p_dissemination_id;

    commit;

  END LOOP;

END;
/

这应该遍历您在上面的查询中定义的所有记录(我在输出中添加了我假设的 pk 和 fk 列。)这将执行 2 次更新,并且解码将处理操作/状态部分。

您当然会想要对此进行测试并根据需要进行一些异常处理。

于 2013-10-21T21:17:49.660 回答