Обновить столбец таблицы с помощью столбца другой таблицы в PostgreSQL
Я хочу скопировать все значения из одного столбца val1 таблицы table1 в один столбец val2 другой таблицы table2. Я попробовал эту команду в PostgreSQL:
update table2
set val2 = (select val1 from table1)
Но я получил эту ошибку:
Ошибка: более одной строки, возвращаемой подзапросом, используемым в качестве выражения
Есть ли альтернатива для этого?
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.
- таблицы-это table1, table2
Comments