2016-09-23 6 views
0

그래서 회사, 주소 및 company_address라는 세 개의 테이블이 있습니다. 최적화 이유로PostgreSQL - 관련 테이블의 열 복사

나는 companies 테이블에 addresses 테이블에서 city 열을 복사해야합니다. 회사와 주소 간의 관계는 많은 기업이 동일한 주소를 사용할 수 있기 때문에 1 대 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' == >>' 업데이트 회사 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; 
관련 문제