【问题标题】:Oracle Update JoinOracle 更新加入
【发布时间】:2013-10-21 16:02:12
【问题描述】:

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

我有一个名为 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 代码吗?谢谢

【问题讨论】:

  • 试图了解您的最终目标。你有 3 件事我认为你想要完成。 1. 设置 child.chain_id = parent.chain_id。 2. 设置 parent.chain_id = 0。 3. 如果 child.action = 3,则设置 child.status = 1。所有这 3 个都只完成“其中 child.chain_id = 0 和 parent.chain_id != 0”或者是任何一个他们分开做?
  • 当且仅当 child.chain_id = 0 和 parent.chain_id != 0 时才完成所有这三件事

标签: sql oracle


【解决方案1】:

我看到的问题是您希望同时更新 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 次更新,解码将处理操作/状态部分。

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

【讨论】:

    【解决方案2】:

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

    看这个例子:

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

    祝你好运

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-07
      • 2019-07-01
      • 1970-01-01
      • 2023-03-09
      • 1970-01-01
      • 1970-01-01
      • 2021-05-04
      • 1970-01-01
      相关资源
      最近更新 更多