Как назначить результат ВЫБОРА в качестве столбца таблицы в sql?

#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 . . . В сгенерированном столбце все значения должны быть из текущей строки или констант. Это ответ на вопрос, который вы задали здесь. Если у вас есть другой вопрос о более сложных вычислениях, вам следует задать новый вопрос.