Как скопировать столбец из одной таблицы в другую, используя JOIN - PullRequest
2 голосов
/ 01 апреля 2012

Что не так со следующим PostgreSQL запросом?

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

1012 * дает *

[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  

Какой правильный синтаксис?

1 Ответ

2 голосов
/ 01 апреля 2012

Следует избегать двух проблем:

1 - в столбце SET = значение, не добавляйте имя таблицы или псевдоним к column.Это приводит к ошибке и в любом случае бесполезно, поскольку UPDATE tablename может обновлять столбцы только с tablename.Псевдоним tablename может использоваться в других местах, но не в предложении SET.

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...