Sql 从一个表更新另一个表中的值

Sql 从一个表更新另一个表中的值,sql,oracle,sql-update,subquery,inner-join,Sql,Oracle,Sql Update,Subquery,Inner Join,我有表A、B和C。我需要从表A中的所有行中选择某些值,然后对于A中的每一行,我需要更新表B和表C中的值 伪代码如下所示: SELECT A1, A2, A3, A4 FROM Table A UPDATE Table B SET B2=A2, B3=A3, B4=A4 WHERE B1 = A1; UPDATE Table C SET C2=A2, C3=A3, C4=A4 WHERE C1 = A1; 如何实现这一点?在Oracle中,您将使用

我有表A、B和C。我需要从表A中的所有行中选择某些值,然后对于A中的每一行,我需要更新表B和表C中的值

伪代码如下所示:

 SELECT A1, A2, A3, A4 FROM Table A 
           UPDATE Table B SET B2=A2, B3=A3, B4=A4 WHERE B1 = A1;
           UPDATE Table C SET C2=A2, C3=A3, C4=A4 WHERE C1 = A1;

如何实现这一点?

在Oracle中,您将使用两个更新语句:

update b
    set (b2, b3, b4) = (select a2, a3, a4 from a where a.a1 = b.b1);

update c
    set (c2, c3, c4) = (select a2, a3, a4 from a where a.a1 = c.b1);

您需要两个update语句。您可以使用内联视图:

update (
    select a.a2, a.a3, a.a4 , b.b2, b.b3, b.b4
    from a
    inner join b on b.b1 = a.a1
) u
set u.b2 = u.a2, u.b3 = u.a3, u.b4 = u.a4
这样做的好处是只更新匹配的行,而使用相关子查询技术,您需要在
where
子句中重复子查询

另一种在Oracle中实现所需功能的简洁语法是
merge

merge into b
using a on (a.a1 = b.a1)
when matched then update set b.b2 = a.a2, b.b3 = a.a3, b.b4 = a.a4;

请提供示例数据和所需结果。如果表B的行数比表A多怎么办?@0xdb。不匹配的行将其值设置为
NULL
。你的问题没有具体说明在这种情况下该怎么办,所以这似乎是合理的行为。