使用第二个表中的信息和Postgresql

时间:2015-06-06 19:47:20

标签: database postgresql join sql-update

我目前的代码如下

UPDATE product_template
SET 
listprice = product_uom.factor * product_template.list_price
FROM product_uom
INNER JOIN product_template ON product_uom.id = product_template.uom_id
INNER JOIN product_product ON product_product.id = product_template.id  
WHERE product_product.manufacturer = 2646 

据我所知,第1行指定了我想要更新的表。 然后我指定我想使用2个数字列更新名为list_price的列,该列位于product_template中。 我指定第二个表,其中包含一个具有我需要的数值的列,以便从将要更新的表更新我的列。 我指定要更新的表的内部联接以及具有我需要的信息的表。 我加入了将要更新的表,该表具有我需要的列作为更新发生的条件。 最后一行说明了为了在该行中进行更新而必须满足的条件。

实际上,如果我尝试在postgresql中运行此代码,我会收到以下错误 错误:表名“product_template”指定了多次

我只使用product_template来指定更新哪个tabkle,再使用两次来创建内部联接,在使用来自2个不同表的信息时更新此表的正确方法是什么?

2 个答案:

答案 0 :(得分:0)

请阅读此链接:http://www.postgresql.org/docs/9.1/static/sql-update.html

  

from_list
表表达式列表,允许来自其他列的列   要在WHERE条件和更新表达式中出现的表。   这类似于可以在中指定的表的列表   FROM SELECT语句的条款。
  请注意,目标表不得出现在from_list中,除非您打算进行自联接   (其中   如果必须在from_list中出现别名。

您需要使用别名为查询中的第二个product_template分配不同的名称,并在要引用此第二个表格的位置将product_template替换为此别名。
PostgreSql不知道你在查询的下方(第一个或第二个)中你所指的product_template。我也不知道。

UPDATE product_template
SET ....... * product_template.list_price
...........
INNER JOIN product_template ON ...... = product_template.uom_id
INNER JOIN  ..........  ON ...... = product_template.id  

答案 1 :(得分:0)

不幸的是,您无法使用JOIN...ON语法连接到正在更新到其余表的表。您必须将这些连接条件移到WHERE子句中,并从product_template子句中删除更新后的表FROM

UPDATE product_template
SET 
list_price = product_uom.factor * product_template.list_price
FROM product_uom, product_product
WHERE product_product.manufacturer = 2646 and
   product_uom.id = product_template.uom_id and
   product_product.id = product_template.id  

(假设你想要进行自我加入,这似乎你不会。如果你想要自我加入,那么你需要分配一个表别名,就像非更新自联接一样。)