Обновите таблицу из другой таблицы, используя подзапрос

Используя postgresql, у меня есть таблица A со столбцами company_name, department_name, некоторыми другими данными и department.

У меня есть другая таблица B с простыми company_name, department_name и did. (Это две таблицы со связью между ними, но я сделал из них представление, чтобы упростить синтаксис.)

Я хочу установить A.department в B.did строки с соответствующими именами. Это часть процесса нормализации.

В соответствии с этим Q&A я пробовал:

UPDATE A 
SET department=did 
FROM A AS A 
INNER JOIN B 
  ON A.company_name = B.company_name AND A.department_name=B.department_name;

Но я получаю результат, что A.department для всех строк установлено одно и то же значение.

(Я также пробовал другой синтаксис из здесь, но получаю синтаксические ошибки как и ожидалось.)

Почему это не работает, а точнее, почему строки не совпадают должным образом. Когда я пробую SELECT в этом объединении, я получаю ожидаемый результат.


person Amin Negm-Awad    schedule 24.01.2017    source источник
comment
Оба вопроса, на которые вы ссылаетесь, относятся к SQL Server, а не к Postgres.   -  person a_horse_with_no_name    schedule 25.01.2017
comment
Да, я не ожидал большего, чем небольшая синтаксическая разница.   -  person Amin Negm-Awad    schedule 25.01.2017


Ответы (1)


В Postgres вы хотите написать запрос следующим образом:

UPDATE A 
    SET department = B.did 
FROM B 
WHERE A.company_name = B.company_name AND
      A.department_name = B.department_name;

Когда вы упоминаете таблицу A в предложении FROM, это отдельная ссылка на A, никак не связанная с обновляемой таблицей. Простое решение — обратиться к таблице только один раз.

person Gordon Linoff    schedule 24.01.2017
comment
@AminNegm-Awad: это также задокументировано в руководстве : Обратите внимание, что целевая таблица не должна появляться в списке from_list, если только вы не планируете самосоединение - person a_horse_with_no_name; 25.01.2017
comment
Спасибо за дополнительную информацию. Я попробовал это аналогичным способом, найденным в упомянутых вопросах и ответах, который показался мне интуитивно понятным. Поэтому я догадался, что у меня чисто синтаксическая проблема, и не увидел подсказки в документах. - person Amin Negm-Awad; 25.01.2017