我在postgresql中有这个查询:
select *
from A s
join B m on (s.id=m.id)
where m.key=4 and s.ran=some_input_from_user
这为我提供了我需要更新的所有行。
我想为所有这些行设置A.value
为90
。
它看起来不像是一个标准的更新查询
如果我......
Update A set value=90 where.....
然后我无法加入。
任何想法怎么做?
答案 0 :(得分:1)
以下是查询:
update a set value = 90
where exists (
select 1 from b
where a.id = b.id and b.key=4
and a.ran=some_input_from_user);
上述查询将消除两次读表的要求。
您也可以使用此查询:
update a set value = 90
where a.id in
(select b.id from b
where a.id = b.id and b.key = 4
and a.ran=some_input_from_user);
答案 1 :(得分:0)
这是PostgreSQL的基本更新语法,您可以根据对另一个表的连接进行更新:
update A s
set
value = 90
from B m
where
s.id = m.id and
m.key = 4 and
s.ran = some_input_from_user
诀窍是你永远不会在set
命令的左值中使用别名。换句话说,value = 90
不是s.value = 90
。它似乎很小,但我很确定它会阻止你的查询工作。理由是如果你正在更新表A(别名s),那么你正在更新的任何字段,事实上,从表A - 不需要别名它们,并且允许别名几乎意味着你可以更新除A以外的东西这句话,你不能。
你绝对可以在rvalues中使用它们,所以这肯定是可以的(如果你想根据B更新A):
update A s
set
value = m.salary * s.commission
from B m
where
s.id = m.id and
(s.value is null or
s.value != m.salary * s.commission)
答案 2 :(得分:-1)
尝试这个
UPDATE A
SET A.VALUE = 90
from A
join B m on (A.id=m.id)
where m.key=4 and s.ran=some_input_from_user