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:根据变量值将一行划分到其他表中的另一行而不遣返