Oracle SQL:使用中间第三个表引用的另一个表更新表列

Posted

技术标签:

【中文标题】Oracle SQL:使用中间第三个表引用的另一个表更新表列【英文标题】:Oracle SQL: Update a table column using another table referenced by 3rd table in-between 【发布时间】:2019-05-17 06:33:49 【问题描述】:

我目前有如下三张表:

表 1

book_id    margin
-------------------
   b1       10
   b2       20
   b3       30

表 2

t2_id   book_id     author_id
-----------------------------
  1         b1        100
  2         b2        200
  3         b3        300

表 3

author_id    revenue
----------------------
   100          0
   200          0
   300          0

我正在尝试更新 table3 上的收入,其中该书的通讯作者(在 table3 上)使用 table1 的 50% 利润。结果应将表 3 更新为:

author_id    revenue
----------------------
   100          10
   200          20
   300          30

如果它们与一个公共键直接链接在一起,我可以更新另一个表中的值,我很难在中间引用另一个表来得到答案:(

我试过了:

UPDATE table3 t3 SET revenue = 
(SELECT t1.margin FROM table1 t1 WHERE
(SELECT t1.book_id FROM table1 t1 JOIN table2 t2 ON t1.book_id = t2.book_id) = 
(SELECT author_id FROM table3 t3 JOIN table2 t2 ON t3.authoer_id = t2.author_id));

谢谢

【问题讨论】:

【参考方案1】:

使用update with join

update 
(
SELECT table3.revenue as OLD, table1.margin as NEW
FROM table1 INNER JOIN table2 on table1.book_id=table2.book_id
inner join table3 on table2.author_id=table3.author_id
)t set t.old=t.new

【讨论】:

谢谢,您的代码运行良好,但显然,我的数据还有很多问题,例如需要 groupby 和 groupby 表返回空值等.....arrrgh【参考方案2】:

对子查询使用合并更新

 MERGE INTO table3 t3 
 using 
 (select t1.margin,t2.author_id
 from tabl1 t1 join table2 t2 on t1.book_id=t2.book_id
  ) a ON (t3.author_id = a.author_id)
 when matchced then
 update SET t3.revenue = a.margin

【讨论】:

【参考方案3】:

您也可以通过with..as 方法使用update

update table3 t3
set t3.revenue = 
    (with t as (
                 select * 
                   from table1 t1
                   join table2 t2 on t2.book_id = t1.book_id
                )
                select t.margin from t where t.author_id = t3.author_id);

Demo

【讨论】:

以上是关于Oracle SQL:使用中间第三个表引用的另一个表更新表列的主要内容,如果未能解决你的问题,请参考以下文章

Oracle SQL:使用来自同一表的另一列的数据更新表

Oracle SQL 获取第三个表的参考

Oracle SQL:根据变量值将一行划分到其他表中的另一行而不遣返

如何在 Oracle 的组中获得第三个 [重复]

如何使用另一个表中的另一列更新一列? SQL 错误:ORA-00933:SQL 命令未正确结束

从另一个表中选择一个表的否定以及oracle的主表sql查询中的数据