2016-09-23 2 views
0

私は3つのテーブルを持っています:会社、住所、company_address。PostgreSQL - 関連テーブルの列をコピー

私は、city列をaddressesテーブルからcompaniesテーブルにコピーする必要があります。企業と住所の関係は、多くの企業が同じ住所を占めることができるため、多対1です。それらはaddress_idcompany_idの列で構成されるcompany_addressテーブルによって接続されています。

私は中間テーブルなしの場合のために、この解決策を見つけた: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会社は、SET company.city = foo.city' == >>' UPDATE company SET city = foo.city'(サブクエリは必要ありません) – joop

答えて

2

サブクエリは必要ありません。また、SET句では、テーブル名に先行することなくテーブルの列を参照してください。

WHERE条件に結合テーブルが含まれているため、LEFT JOINの代わりにINNER 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; 
関連する問題