2012-04-01 19 views
2

Was ist los mit der folgenden PostgreSQL Abfrage?Wie kopiert man Spalte von einer Tabelle in eine andere mit 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 

gibt

[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 

Ich habe versucht,

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 

Was gibt, ist die korrekte Syntax?

Antwort

2

Es gibt zwei Probleme zu vermeiden:

1- in SET column = Wert, nicht einen Tabellennamen oder alias zu column voranstellen. Es ergibt sich ein Fehler und ist sowieso nutzlos, da nur Spalten von tablename aktualisieren kann. Ein Alias ​​von Tabellenname kann an anderen Stellen, aber nicht in der SET-Klausel verwendet werden.

2- Wiederholen Sie nicht den Namen der Tabelle, die im Rest der Abfrage aktualisiert werden soll, es sei denn, Sie möchten einen sekundären und unkorrelierten Scan dieser Tabelle spezifisch veranlassen.

Hier ist mein Vorschlag einer modifizierten Abfrage, die ich hoffe, das tut, was Sie beabsichtigen:

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); 
Verwandte Themen