Как обновить только 1 столбец, но для всех строк с вычислением?

#sql #sql-server #sql-server-2008

#sql #sql-сервер #sql-server-2008

Вопрос:

Я хочу обновить только 1 столбец для всех строк в моей таблице с общим вычислением: данные столбца умножаются на случайное число от 0,9 до 1,2..

 UPDATE TABLE
SET ABC = (SELECT ABC*(RAND()*((1.2-0.9) 0.9)) FROM TABLE)
  

Ну, я знаю, как записать это в надлежащем T-SQL. Я не получил ожидаемого результата в SQL Server 2008 R2 с моим запросом. Нужна ваша помощь, ребята, чтобы решить эту проблему.
Или вы можете дать мне другое решение с использованием cursor.

Комментарии:

1. Какие еще столбцы есть в вашей таблице?

2. в любом случае таблица является подробной таблицей и получается в результате объединения других 4 таблиц. И в этой таблице нет PK.. Он содержит Date, PrdID, CstId и CurrBalance.. Столбец, который я хочу вычислить, — это CurrBalance..

3. » Столбец, который я хочу вычислить, — это CurrBalance » — в вашем примере показан столбец, abc который обновляется как формула на основе только содержимого этого столбца. Либо ваш комментарий неверен, либо вы задаете вопрос.

4. да, сначала я не хотел приводить никаких подробностей о моей таблице, и после вопроса Дэмиена, я думаю, будет нормально, если просто указать имя.. Итак, CurrBalance — это столбец, который я хочу вычислить.. И, ребята, мне нужен запрос, который выдаст мне общий расчет для каждой строки, поэтому простой запрос на обновление не исправит эту проблему. Мне нужно создать фиктивные данные из тысяч строк. И это основано на случайном числе CurrBalance * в диапазоне от 0.9 до1.2..

Ответ №1:

Думаю, у вас проблема с круглыми скобками (для rand «range»), а не со способом написания запроса (если я правильно понял)

 update table
set abc = abc * (RAND() * (1.2-0.9)   0.9)
  

ВНИМАНИЕ

«случайный» множитель будет одинаковым для всех строк, обновленных этим оператором, как заметил Damien_The_Unbeliever

Комментарии:

1. Это решает большинство проблем, кроме того факта, что RAND() будет возвращать одно и то же значение для каждой строки, что, как я предполагал, не является требуемым поведением (но готов к ошибкам)

2. @Damien_The_Unbeliever Вы совершенно правы, действительно, добавлю ПРЕДОСТЕРЕЖЕНИЕ

3. Спасибо за помощь, Раф. Но да, запрос дал мне одинаковый результат для всех строк, я ищу запрос, который дал бы мне общий расчет для каждой строки..

Ответ №2:

 SET NOCOUNT ON
DECLARE 
    @ABC_ID                        AS INT, 
    @RANDOM_GEN_NO    AS VARCHAR(50),
    @TEMP                        AS VARCHAR(50)

DECLARE ABC_CURSOR CURSOR FOR
SELECT @ABC_ID, RANDOM_GEN_NO FROM ABCTABLE FOR UPDATE OF RANDOM_GEN_NO
OPEN ABC_CURSOR
FETCH NEXT FROM ABC_CURSOR
INTO @EMP_ID, @RANDOM_GEN_NO

WHILE (@@FETCH_STATUS = 0)
BEGIN
    SELECT @TEMP =  ABC*(RAND()*((1.2-0.9) 0.9))
    UPDATE ABCTABLE SET ABC = @TEMP WHERE CURRENT OF ABC_CURSOR

    FETCH NEXT FROM ABC_CURSOR
    INTO @ABC_ID, @RANDOM_GEN_NO
END

CLOSE ABC_CURSOR
DEALLOCATE ABC_CURSOR

SET NOCOUNT OFF
  

Или В инструкции Update update ABCTable УСТАНОВИТЕ ABC = abc * yourcode

нет необходимости выбирать в инструкции update

Комментарии:

1. Это слишком сложно для простого update оператора — плюс обработка курсора будет намного медленнее, чем простое обновление.

2. да, я согласен с тем, что @user3812036 просил выполнить его требование с помощью cursor, поэтому я предоставил ему достаточно простого обновления

3. Я думаю, это то, что я ищу.. Я проверю это, и если это будет решено, я вернусь за благодарностью..

4. Это решение — чей-то пост в Интернете, но в любом случае спасибо. В приведенном выше коде есть некоторые синтаксические ошибки, но еще раз спасибо, сэр..

Ответ №3:

 UPDATE YourTABLE
SET ABC = ABC*(RAND()*((1.2-0.9) 0.9))
  

Комментарии:

1. Думаю, что диапазон rand не будет между 0.9 и 1.2 с этим кодом (вы должны добавить нижнюю границу после умножения)

Ответ №4:

хорошо, в вашем блоке кода я вижу несколько основных синтаксических ошибок. Базовый синтаксис инструкции update является

 UPDATE [Tablename] 
    SET [Columnname] = (Value or Calculation or subquery) 
    WHERE (condition)
  

Для получения дополнительной информации проверьте это

Ответ №5:

Попробуйте приведенный ниже код:

ОБНОВИТЕ
НАБОР A.ABC = B.rand
из
внутреннего соединения
таблицы A (ВЫБЕРИТЕ A.pkcolumn,A.ABC*(RAND()*((1.2-0.9) 0.9)) как rand ИЗ ТАБЛИЦЫ A)B
в A.pkcolumn = B.pkcolumn