基本上,我想这样做:
update vehicles_vehicle v
join shipments_shipment s on v.shipment_id=s.id
set v.price=s.price_per_vehicle;
我很确定这在MySQL(我的背景)中可以工作,但在postgres中似乎不起作用。我得到的错误是:
ERROR: syntax error at or near "join"
LINE 1: update vehicles_vehicle v join shipments_shipment s on v.shi...
^
当然有一个简单的方法来做到这一点,但我找不到合适的语法。那么,我该如何在PostgreSQL中写这个呢?
在这种情况下,Mark Byers的答案是最优的。
尽管在更复杂的情况下,你可以使用select查询返回rowids和计算值,并将其附加到更新查询,如下所示:
with t as (
-- Any generic query which returns rowid and corresponding calculated values
select t1.id as rowid, f(t2, t2) as calculatedvalue
from table1 as t1
join table2 as t2 on t2.referenceid = t1.id
)
update table1
set value = t.calculatedvalue
from t
where id = t.rowid
这种方法允许您开发和测试选择查询,并在两个步骤中将其转换为更新查询。
所以在你的例子中,结果查询将是:
with t as (
select v.id as rowid, s.price_per_vehicle as calculatedvalue
from vehicles_vehicle v
join shipments_shipment s on v.shipment_id = s.id
)
update vehicles_vehicle
set price = t.calculatedvalue
from t
where id = t.rowid
请注意,列别名是必须的,否则PostgreSQL将抱怨列名的模糊性。
在PostGRE SQL / AWS (SQL工作台)中使用另一个表更新一个表。
在PostGRE SQL中,你需要在UPDATE Query中使用join:
UPDATE TABLEA set COLUMN_FROM_TABLEA = COLUMN_FROM_TABLEB FROM TABLEA,TABLEB WHERE FILTER_FROM_TABLEA = FILTER_FROM_TABLEB;
Example:
Update Employees Set Date_Of_Exit = Exit_Date_Recorded , Exit_Flg = 1 From Employees, Employee_Exit_Clearance Where Emp_ID = Exit_Emp_ID
表A - Employees列表A - Date_Of_Exit,Emp_ID,Exit_Flg表B是- Employee_Exit_Clearance列表B - Exit_Date_Recorded,Exit_Emp_ID
1760行受影响
执行时间:29.18秒
在这种情况下,Mark Byers的答案是最优的。
尽管在更复杂的情况下,你可以使用select查询返回rowids和计算值,并将其附加到更新查询,如下所示:
with t as (
-- Any generic query which returns rowid and corresponding calculated values
select t1.id as rowid, f(t2, t2) as calculatedvalue
from table1 as t1
join table2 as t2 on t2.referenceid = t1.id
)
update table1
set value = t.calculatedvalue
from t
where id = t.rowid
这种方法允许您开发和测试选择查询,并在两个步骤中将其转换为更新查询。
所以在你的例子中,结果查询将是:
with t as (
select v.id as rowid, s.price_per_vehicle as calculatedvalue
from vehicles_vehicle v
join shipments_shipment s on v.shipment_id = s.id
)
update vehicles_vehicle
set price = t.calculatedvalue
from t
where id = t.rowid
请注意,列别名是必须的,否则PostgreSQL将抱怨列名的模糊性。
我举个例子再解释一下。
任务:正确的信息,在哪里abiturients(即将离开中学的学生)提交申请大学早于他们获得学校证书(是的,他们获得证书早于他们颁发的证书(指定证书日期)。因此,我们将增加申请提交日期,以适应证书颁发日期。
因此。下一个mysql类语句:
UPDATE applications a
JOIN (
SELECT ap.id, ab.certificate_issued_at
FROM abiturients ab
JOIN applications ap
ON ab.id = ap.abiturient_id
WHERE ap.documents_taken_at::date < ab.certificate_issued_at
) b
ON a.id = b.id
SET a.documents_taken_at = b.certificate_issued_at;
以这样的方式变得像postgresql
UPDATE applications a
SET documents_taken_at = b.certificate_issued_at -- we can reference joined table here
FROM abiturients b -- joined table
WHERE
a.abiturient_id = b.id AND -- JOIN ON clause
a.documents_taken_at::date < b.certificate_issued_at -- Subquery WHERE
可以看到,原来的子查询JOIN的ON子句已经变成了WHERE条件之一,由AND与其他子查询连接,这些子查询已经从子查询中移动,没有任何变化。并且不再需要将表与自身连接(就像在子查询中那样)。