编辑:不要使用,执行时间呈二次增长
很遗憾运行时间如此糟糕,因为语法非常优雅。
我保留这个答案,以免其他人走上这条路。
这个答案与其他的不同,因为
你不需要重复连接条件。
- 你在FROM子句中只连接一次
- 而WHERE子句检查X表的行是否存在于(X作为X_joined join Y)中。
结果是,这适用于自然连接,非常方便。
示例查询
假设你有一个名为shipment
的表,你想要从vehicle
表中获取信息,并且两个表都有一个名为vehicle_id
的列,所以你可以使用NATURAL JOIN
。
EXPLAIN UPDATE shipment
SET shipment.speed = vehicle.average_speed
FROM
shipment s_joined NATURAL JOIN vehicle
WHERE
shipment = s_joined
AND shipment.destination = 'Perth'
最小工作示例
create temporary table shipment (
vehicle_id varchar(20),
cargo varchar(20),
speed integer
);
insert into shipment values
('cart', 'flowers', 60),
('boat', 'cabbage', null),
('cart', 'potatos', null),
('foot', 'carrots', null);
create temporary table vehicle (
vehicle_id varchar(20),
average_speed integer
);
insert into vehicle values
('cart', 6),
('foot', 5);
UPDATE shipment
SET speed = vehicle.average_speed
FROM shipment as s_joined natural join vehicle
WHERE shipment = s_joined
AND shipment.speed is null;
TABLE shipment;
┌────────────┬─────────┬───────┐
│ vehicle_id │ cargo │ speed │
├────────────┼─────────┼───────┤
│ cart │ flowers │ 60 │ <- not updated: speed was not null
│ boat │ cabbage │ │ <- not updated: no boat in join
│ cart │ potatos │ 6 │ <- updated
│ foot │ carrots │ 5 │ <- updated
└────────────┴─────────┴───────┘
vehicles_*
的视图表和几个shipments_*
表。 - mpen