我目前的代码如下
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个不同表的信息时更新此表的正确方法是什么?
答案 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
(假设你不想要进行自我加入,这似乎你不会。如果你想要自我加入,那么你需要分配一个表别名,就像非更新自联接一样。)