PostgreSQL - 从相关表中复制列
Posted
技术标签:
【中文标题】PostgreSQL - 从相关表中复制列【英文标题】:PostgreSQL - copy column from related table 【发布时间】:2016-09-23 13:47:48 【问题描述】:所以我有三个表:company、address 和 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;
但它给出了错误:
错误:关系“公司”的“公司”列不存在
我不知道发生了什么。如有任何想法,我将不胜感激。
【问题讨论】:
UPDATE company SET company.city=foo.city
==>> UPDATE company SET city=foo.city
(你不需要子查询)
【参考方案1】:
您不需要子查询。此外,请在 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
请注意使用别名作为表名如何缩短代码并使其一目了然。
【讨论】:
【参考方案2】:你是对的语法,你只是不需要更新语句开头的表名:
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;
【讨论】:
以上是关于PostgreSQL - 从相关表中复制列的主要内容,如果未能解决你的问题,请参考以下文章