2015-06-06 3 views
0

Мой текущий код выглядит следующим образомОбновление таблицы с использованием информации из второй таблицы, и условие из третьей таблицы в Postgresql

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 определяет, какие таблицы я хочу, чтобы обновить. , тогда я указываю, что хочу обновить столбец с именем list_price, который находится в product_template, используя 2 числовых столбца. Я указываю вторую таблицу, в которой есть столбец с числовым значением, необходимым для обновления моего столбца из таблицы, которая будет обновляться. Я указываю внутреннее соединение таблицы, которая будет обновляться, и таблицу, в которой есть информация, которую мне нужно сделать. Я присоединяюсь к таблице, которая будет обновляться таблицей, в которой есть столбец, который мне нужен в качестве условия для обновления. В последней строке указано условие, которое должно выполняться для обновления в этой строке.

Как это, если я пытаюсь запустить этот код в PostgreSQL Я получаю следующее сообщение об ошибке ОШИБКА: имя таблицы «product_template» задано несколько раз

Я использую только product_template указать, какие tabkle будет обновляться и два раза для создания внутренних соединений, каков правильный способ обновления этой таблицы при использовании информации из двух разных таблиц?

ответ

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 

(Это предполагает, что вы делаете не хотите сделать автообъединение, что это, кажется, вы не знаете. Если вы хотите автообъединение, то вам нужно присвоить псевдоним таблицы, просто как с самообновлением без обновления.)

+0

Работы, принятые в качестве ответа. – Marcus

0

Читать эту ссылку: http://www.postgresql.org/docs/9.1/static/sql-update.html

from_list
A list of table expressions, allowing columns from other tables to appear in the WHERE condition and the update expressions. This is similar to the list of tables that can be specified in the FROM Clause of a SELECT statement.
Note that the target table must not appear in the from_list, unless you intend a self-join
(in which case it must appear with an alias in the 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 
+0

Это правильно, спасибо вам. – Marcus

Смежные вопросы