使用联接更新多行

时间:2016-01-11 11:04:03

标签: sql postgresql

我在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.value90

它看起来不像是一个标准的更新查询

如果我......

Update A set value=90 where..... 

然后我无法加入。

任何想法怎么做?

3 个答案:

答案 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