sql - 根据另一个表更新行

标签 sql oracle11g sql-update

我有一个表格,用于跟踪库存中链轮的物理质量。

create table sprockets(
    id NUMBER,
    mass NUMBER
);

INSERT into sprockets VALUES (1, 4);
INSERT into sprockets VALUES (2, 8);
INSERT into sprockets VALUES (3, 15);
INSERT into sprockets VALUES (4, 16);
INSERT into sprockets VALUES (5, 23);
INSERT into sprockets VALUES (6, 42);

我聘请链轮机械师对我的链轮进行日常维护。如果他们的修改使链轮的质量发生变化,他们会在维护报告中记录下来。

create table maintenance_events(
    sprocket_id NUMBER,
    new_mass NUMBER
);

--chipped a widget off of sprocket #1; mass reduced to 3 kg
INSERT into maintenance_events VALUES (1, 3);       
--new lead bearings makes sprocket #2 weigh 413 kg
INSERT into maintenance_events VALUES (2, 413);     

我想用每个链轮的当前质量更新 sprockets 表。我想采用 maintenance_events 中的 new_mass 并覆盖 sprockets 中的旧 mass 值。我引用了 this question 中的前两个答案, 但都给出错误。

UPDATE sprockets
set mass = maintenance_events.new_mass
from sprockets, maintenance_events
where sprockets.id = maintenance_events.sprocket_id

Error at Command Line:2 Column:38
Error report:
SQL Error: ORA-00933: SQL command not properly ended

UPDATE sprockets
set sprockets.mass = maintenance_events.new_mass
from sprockets
INNER JOIN maintenance_events
on sprockets.id = maintenance_events.sprocket_id

Error at Command Line:2 Column:48
Error report:
SQL Error: ORA-00933: SQL command not properly ended

我做错了什么?

最佳答案

这就是merge ,一个 upsert,用于:

merge into sprockets s
using ( select * from maintenance_events ) m
on (s.id = m.sprocket_id)
when matched then
 update 
    set s.mass = m.new_mass
        ;

这比使用 where not exists 等进行多个表扫描要高效得多。

这是一个 SQL Fiddle以证明它有效。

关于sql - 根据另一个表更新行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12166056/

相关文章:

c# - 获取最后一次购买以及价格

php - 使用 MATCH AGAINST 加速 MySQL 查询搜索多个表

sql - PostgreSQL 将列转换为行?转置?

sql - 在Oracle中删除所有用户表/序列

oracle - 如何在 Oracle SQL Developer 中防止 "parameter PLSQL_DEBUG is deprecated"编译器警告

sql - Oracle UPDATE 使用包含 JOIN 的 SELECT 语句

java - 我如何模拟 c3p0 ComboPooledDataSource

multithreading - oracle行争用在高吞吐量JMS应用程序中导致死锁错误

mysql - 如何根据条件更新多列?

mysql - 如何编写包含连接、更新和排序依据的查询?