PostgreSQL - 从相关表中复制列

时间:2016-09-23 13:47:49

标签: sql postgresql

所以我有三个表:公司,地址和company_address。

出于优化原因,我需要将city列从addresses表复制到companies表。公司和地址之间的关系是多对一的(因为许多公司可以占用相同的地址)。它们通过company_address表连接,包含address_idcompany_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;

但它给出了错误:

  

错误:专栏"公司"关系"公司"不存在

我无法弄清楚发生了什么。我会对任何想法表示感谢。

2 个答案:

答案 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;