Обновить столбец таблицы с помощью столбца другой таблицы в PostgreSQL



Я хочу скопировать все значения из одного столбца val1 таблицы table1 в один столбец val2 другой таблицы table2. Я попробовал эту команду в PostgreSQL:



update table2
set val2 = (select val1 from table1)


Но я получил эту ошибку:




Ошибка: более одной строки, возвращаемой подзапросом, используемым в качестве выражения




Есть ли альтернатива для этого?

1670   2  

2 ответов:

Ваш UPDATE запрос действительно должен выглядеть так:

UPDATE table2 t2
SET    val2 = t1.val1
FROM   table1 t1
WHERE  t2.table2_id = t1.table2_id
AND    t2.val2 IS DISTINCT FROM t1.val1  -- optional, to avoid empty updates

В том виде, в котором вы это сделали, не было никакой связи между отдельными строками двух таблиц. Каждая строка будет извлечена из table1 для каждой строки в table2. Это не имело смысла (дорогостоящим способом), а также вызвало синтаксическую ошибку, потому что выражение подзапроса в этом месте разрешено возвращать только одно значение.

  • Я исправил это, соединив две таблицы на table2_id. Замените это на что угодно на самом деле связывает эти два.

  • Я переписал UPDATE, чтобы присоединиться к table1 (с предложением FROM) вместо выполнения коррелированных подзапросов, потому что это регулярно быстрее на порядок.
    Это также предотвращает то, что table2.val2 будет обнулено, если в table1 не будет найдена соответствующая строка. Вместо этого ничего не происходит с такими строками при такой форме запроса.

  • Вы можете включить все те же вещи в список FROM, который вы могли бы включить в простой SELECT (например, несколько таблиц или подзапросов). за документацию:

from_list

Список табличных выражений, позволяющий столбцам из других таблиц появляются в условии WHERE и выражениях обновления. Это аналогично списку таблиц, которые могут быть указаны в FROM пункт высказывания SELECT. Обратите внимание, что целевая таблица не должна появляться в тот самый from_list, если только вы не намерены ... самосоединение (в этом случае он должен появиться с псевдонимом в from_list).

  • последнее предложение WHERE предотвращает обновления, которые ничего бы не изменили - что практически всегда является хорошей идеей (полная стоимость, но без прибыли - применяются экзотические исключения).

Обновить table1 установить table1_column= table2.столбец из таблицы table2, где table1_id= table2.id

  1. Не используйте псевдоним для таблицы 1.
  2. таблицы-это table1, table2

Comments

    Ничего не найдено.