2012-04-01 6 views
2

PostgreSQLクエリで何が問題になっていますか?JOINを使用してあるテーブルから別のテーブルに列をコピーする方法

UPDATE project_project SET project_project.create_date = assignments.start_date 
FROM project_project 
LEFT JOIN account_analytic_account ON account_analytic_account.id = project_project.analytic_account_id 
LEFT JOIN assignments ON assignments.accounts_ref = account_analytic_account.id 

は、私が試した

[SQL] UPDATE project_project SET project_project.create_date = assignments.start_date 
FROM project_project 
LEFT JOIN account_analytic_account ON account_analytic_account.id = project_project.analytic_account_id 
LEFT JOIN assignments ON assignments.accounts_ref = account_analytic_account.id 

[Err] ERROR: table name "project_project" specified more than once 

を与える

UPDATE pp SET pp.create_date = am.start_date 
FROM project_project as pp 
LEFT JOIN account_analytic_account as aa ON aa.id = pp.analytic_account_id 
LEFT JOIN assignments as am ON am.accounts_ref = aa.id 

は正しい構文は何

[SQL] UPDATE pp SET pp.create_date = am.start_date 
FROM project_project pp 
LEFT JOIN account_analytic_account aa ON aa.id = pp.analytic_account_id 
LEFT JOIN am ON am.accounts_ref = aa.account_analytic_account.id 

[Err] ERROR: relation "pp" does not exist 
LINE 1: UPDATE pp SET pp.create_date = am.start_date 

を与えますか?

答えて

2

回避するために、二つの問題があります:SET列で

1 - =値は、columnにテーブル名またはエイリアスを付加しないでください。 UPDATE tablenameは列をtablenameからのみ更新することができるため、エラーが発生し、役に立たなくなります。 tablenameのエイリアスは、他の場所で使用できますが、SET句では使用できません。

2-このテーブルの第2の無相関スキャンを具体的に誘導しない限り、残りのクエリで更新するテーブルの名前を繰り返しません。ここで

は、私はあなたが意図し何を願う修正クエリの私の提案です:

UPDATE project_project pp SET create_date = 
(select assignments.start_date FROM account_analytic_account LEFT JOIN assignments 
    ON assignments.accounts_ref = account_analytic_account.id 
WHERE 
account_analytic_account.id = pp.analytic_account_id); 
関連する問題