2

在庫にあるスプロケットの物理的な質量を追跡するテーブルがあります。

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各スプロケットの現在の質量でテーブルを最新の状態に保ちたいです。を取り込んで、の古い値を上書きnew_massしたい。この質問の上位2つの回答を参照しましたが、どちらもエラーになります。maintenance_eventsmasssprockets

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

私は何が間違っているのですか?

4

3 に答える 3

3

これがmerge、アップサートの目的です。

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フィドルです。

于 2012-08-28T19:51:47.713 に答える
2

これはどうですか?

UPDATE sprockets
SET sprockets.mass = (select new_mass 
                           from maintenance_events 
                      where sprockets.id = maintenance_events.sprocket_id)
WHERE EXISTS (select new_mass 
                           from maintenance_events 
                      where sprockets.id = maintenance_events.sprocket_id);
于 2012-08-28T19:23:38.313 に答える
1

これを試して:

UPDATE sprockets
set mass = (select maintenance_events.new_mass
from maintenance_events
where sprockets.id = maintenance_events.sprocket_id) where exists 
(select maintenance_events.sprocket_id from maintenance_events 
 where sprockets.id = maintenance_events.sprocket_id);

ここで確認できます:http ://sqlfiddle.com/#!5 / f4262 / 11/0

于 2012-08-28T19:28:27.067 に答える