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_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;

但它给出了错误:

错误:关系“公司”的“公司”列不存在

我不知道发生了什么。如有任何想法,我将不胜感激。

【问题讨论】:

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 - 从相关表中复制列的主要内容,如果未能解决你的问题,请参考以下文章

PostgreSQL - 从连接表中选择聚合列并使用它来求和

根据某些条件从多个表中读取列值 - postgreSQL

Postgresql从具有不同列数的2个表中选择多条记录

从内部连接更新列[重复]

Spark 从 PostgreSQL 表中读取单列

在PostgreSQL中,如何根据分类列中每个级别的比例从表中随机抽样?