2016-09-23 20 views
0

所以我有三個表:公司,地址和company_address。PostgreSQL - 從相關表複製列

由於優化原因,我需要將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; 

,但它給錯誤:

ERROR: column "company" of relation "company" does not exist

我不能圖瞭解正在發生的事情。我會很感激任何想法。

+0

'UPDATE公司成立company.city = foo.city' == >>'更新公司SET城市= foo.city'(你不需要子查詢) – joop

回答

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 

請注意,如何使用表名稱來縮短代碼並使其可讀性乍一看。

0

你是對的語法,你只是沒有在更新語句的開始所需要的表名:

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;