根据条件更新另一张表的列值为另一张表的某一列。

157

我有两个表...

table1(id,item,price)的值为:

id | item | price
-------------
10 | book | 20  
20 | copy | 30   
30 | pen  | 10

....table2 ( id, item, price) values:

(id,item,price)的值:
id | item | price
-------------
10 | book | 20
20 | book | 30

现在我想要:

update table1 
   set table1.Price = table2.price 
 where table1.id = table2.id
   and table1.item = table2.item.

我该如何做?


@mrp:你不应该把每个关系型数据库都标记为标签,因为有人可能会建议您使用某个特定供应商的解决方案。 - RageZ
1
有关PostgreSQL,请参见SO答案 - Akaisteph7
2个回答

313

应该像这样做:

UPDATE table1 
   SET table1.Price = table2.price 
   FROM table1  INNER JOIN  table2 ON table1.id = table2.id

你也可以尝试这个:

UPDATE table1 
   SET price=(SELECT price FROM table2 WHERE table1.id=table2.id);

4
出现错误信息:无效的对象 table1。 - niceApp
4
出现了错误。无法绑定多部分标识符“table1.price”。 - niceApp
1
@Sam,这是因为你在UPDATE和FROM子句中引用了table1(同一张表被引用了两次)。根据脚本,你实际上是在更新你正在查询的表中的字段,而不是你正在更新的表中的字段。SET子句应该引用UPDATE表,即UPDATE table1 SET price = b.price FROM (SELECT id, price AS p FROM table1) a INNER JOIN table2 b on a.id = b.id - rjmd
11
无法在MySQL中运行 - cikatomo
37
针对MySQL数据库,可以使用以下语句:UPDATE table1 INNER JOIN table2 ON table1.id = table2.id SET table1.Price = table2.price - rajthakur
显示剩余4条评论

100

这肯定会起作用:

UPDATE table1
SET table1.price=(SELECT table2.price
  FROM table2
  WHERE table2.id=table1.id AND table2.item=table1.item);

1
但是它正在更新比它应该更新的更多的行 :( - Kanagavelu Sugumar
1
它应该只更新内部查询返回的行数,但是却发生了两倍的更新。:( - Kanagavelu Sugumar
更新双精度... - Himanshu Bansal
这应该是被接受的答案,因为大多数数据库支持子查询,而不是连接,用于UPDATE语句。@niceApp - vijay

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接