基于其他表中的行的 PLSQL 更新

Posted

技术标签:

【中文标题】基于其他表中的行的 PLSQL 更新【英文标题】:PLSQL UPDATE BASED ON ROWS FROM OTHER TABLE 【发布时间】:2014-08-17 13:17:40 【问题描述】:

我在 APEX A 和 B 中有以下表格。

A 有列:

ID_A; 
VALUE;

B 有列:

ID_C_FK;
ID_A_FK

我想在ID_A 等于ID_A_FK 的表B 的选定行中更新表A 中的VALUE 列,其中ID_C_FK 等于x

例如:A 有行(

ID_A  value
------------
  1     1
  2     1
  3     0
  4     0
  5     0

B 有行

ID_C_FK  ID_A_FK
------------------
  8         4
  9         4
  9         5

我想更新表A 中的VALUE 仅适用于从B 中选择的行中具有ID_A 的行,并且从B 中选择行的条件是ID_C_FK 等于x = 9;因此,表 A 最终应该有行:

ID_A  value
------------
  1      1
  2      1  
  3      0
  4      1
  5      1

如何在 PL/SQL 中编写这样的更新?

感谢您考虑我的请求。

【问题讨论】:

为什么你认为你需要一个存储过程? 我不明白你的问题,请你换个说法好吗? @horse with no name: 我在 apex 做项目,我必须在使用按钮提交后更新表格。我创建了这样的例子来说明问题 【参考方案1】:

我想这就是你想要的:

update a
    set value = 1
    where exists (select 1
                  from b
                  where b.id_a_fk = a.id_a and b.id_c_fk = 9
                 );

【讨论】:

为什么你把 1 放在 select 之后?我不明白这一点:b.id_a_fk = a.id_a 和 b.id_c_fk = 9 这是一个相关子查询。 1 只是一个任意值,如果存在匹配则返回一些东西。 where 上的条件是要匹配两个表文本中的join 条件。 b.id_c_fk = 9 选择 idd_c_fk= 9 的行,好的,但是如何理解这个意思: b.id_a_fk = a.id_a 在你所放的代码的上下文中。这个想法是更新 A 中由 b.id_a_fk 指示的行中 b.id_c_fk = 9 的行 所以外部部分 - 更新应该只在从 id_c_fk=9 的 b 行中选择 id 的行中设置值 @user3376246 。 . .这就是为什么有两个条件。 id_a 需要匹配id_a_fk 并且另一列的值需要是9

以上是关于基于其他表中的行的 PLSQL 更新的主要内容,如果未能解决你的问题,请参考以下文章

如何使用填充旧表中的行的动态数据动态更新新MySQL表中的行?

SQL:插入更新主键相同的行的所有其他列

PLSQL: BEFORE INSERT TRIGGER(在允许插入之前检查其他表中的列中的值)

如何不选择其他表中不存在的行

4.10 用其他表中的值更新

CockroachDB 中的行级锁定