#sql #postgresql
Вопрос:
У меня есть следующая таблица (table_test) в базе данных postgres:
id value description
-----------------------------------------
741 1 'description X'
152 2 'description X'
555 1 'description X'
Мне нужно создать новый столбец в этой таблице. Новый столбец должен получить значение столбца «значение», умноженное на 1000 и разделенное на 3.
Сначала я создал новый столбец под названием «new_column»
ALTER TABLE table_test
ADD new_column float(10)
Затем я выполнил желаемую операцию с помощью ВЫБОРА:
SELECT ((value * 1000) / 3)
FROM table_test
Проблема возникла, когда я попытался дублировать результат ВЫБОРА во вновь созданном столбце. Я пытался сделать (не работает):
UPDATE table_test
SET new_column = (SELECT ((value * 1000) / 3)
FROM table_test)
Появится следующее сообщение об ошибке:
ОШИБКА: более одной строки, возвращаемой подзапросом, используемым в качестве выражения
Состояние SQL: 21000
Я бы хотел, чтобы результат был:
id value description new_column
--------------------------------------------------------
741 1 'description X' 333
152 2 'description X' 666
555 1 'description X' 333
Ответ №1:
Вместо этого вы можете добавить вычисляемый столбец:
ALTER TABLE table_test ADD new_column float GENERATED ALWAYS AS
(value * 10000 / 3.0) stored;
Это означает, что значение всегда актуально.
Однако, если вы просто хотите задать значение, update
для несгенерированного столбца просто:
UPDATE table_test
SET new_column = value * 1000 / 3.0;
Комментарии:
1. здравствуйте, извините, я должен что-то сделать с исходным вопросом, но позволяет ли первое решение также выполнять сложные запросы (например, в соотношении 1 к N количество детей)?
2. @Berto99 . . . В сгенерированном столбце все значения должны быть из текущей строки или констант. Это ответ на вопрос, который вы задали здесь. Если у вас есть другой вопрос о более сложных вычислениях, вам следует задать новый вопрос.