所以我有三个表:公司,地址和company_address。
出于优化原因,我需要将city
列从addresses
表复制到companies
表。公司和地址之间的关系是多对一的(因为许多公司可以占用相同的地址)。它们通过company_address表连接,包含address_id
和company_id
列。
我在没有中间表的情况下找到了这个解决方案:How to copy one column of a table into another table's column in PostgreSQL comparing same ID
尝试修改我提出的查询:
UPDATE company SET company.city=foo.city
FROM (
SELECT company_address.company_id, company_address.address_id, address.city
FROM address LEFT JOIN company_address
ON address.id=company_address.address_id
) foo
WHERE company.id=foo.company_id;
但它给出了错误:
错误:专栏"公司"关系"公司"不存在
我无法弄清楚发生了什么。我会对任何想法表示感谢。
答案 0 :(得分:2)
你不需要子查询。另外,请在SET
子句中引用表格列,而不使用表名。
我认为,由于您的WHERE
条件包含已加入的表格,因此应该是INNER JOIN
而不是LEFT JOIN
。
UPDATE company c
SET city = a.city
FROM address a
INNER JOIN company_address ca ON a.id = ca.address_id
WHERE c.id = ca.company_id
注意如何使用表名的别名缩短代码并使其在第一眼看上去可读。
答案 1 :(得分:0)
你在语法上是正确的,你只需要在update语句的开头不需要表名:
UPDATE company SET city=foo.city
FROM (
SELECT company_address.company_id, company_address.address_id, address.city
FROM address LEFT JOIN company_address
ON address.id=company_address.address_id
) foo
WHERE company.id=foo.company_id;