2017-01-28 3 views
1

Вот табличное представление того, что я хотел бы получить с помощью инструкции UPDATE.MySQL - запрос UPDATE с оператором SET в зависимости от результата предыдущего оператора SET

+----+----+---+---+----+----------+---------------+---------------+ 
| ID | A | B | C | D | Calc A | Calc B  | Calc C  | 
+----+----+---+---+----+----------+---------------+---------------+ 
| 1 | 6 | 5 | 2 | 10 | =[A]-[B] | =[Calc A]/[D] | =[B]/[Calc B] | 
| 2 | 8 | 5 | 2 | 10 | =[A]-[B] | =[Calc A]/[D] | =[B]/[Calc B] | 
| 3 | 10 | 5 | 2 | 10 | =[A]-[B] | =[Calc A]/[D] | =[B]/[Calc B] | 
+----+----+---+---+----+----------+---------------+---------------+ 

Мой текущий оператор UPDATE для достижения этой цели заключается в следующем ...

UPDATE [EXAMPLE] 
SET [Calc A] = A - B 
    , [Calc B] = [Calc A]/D 
    , [Calc C] = B/[Calc B] 

Однако он не работает должным образом. [Calc A] будет правильно вычислять первое UPDATE. Однако [Calc B] вычислит значение OLD в [Calc A], а не NEW обновленное значение, которое я только что написал в базе данных. Это справедливо для [Calc C], который снова ссылается на OLD-значение [Calc B].

Если вы выполняете инструкцию UPDATE 3 раза, данные будут вычисляться правильно. [Calc A] устанавливается правильно в первом вычислении, тогда [Calc B] будет ссылаться на правильное обновленное значение [Calc A] во втором UPDATE, тогда [Calc C] будет ссылаться на правильное значение [Calc B] в Третье ОБНОВЛЕНИЕ.

Итак, мой вопрос заключается в том, как установить все столбцы в их правильное значение в ONE update statement?

+0

Вы используете MySQL или Microsoft SQL Server? Ваше использование квадратных скобок заставляет меня думать, что вы используете Microsoft. –

+0

@BillKarwin MySQL, использовал только квадратные скобки из-за пробелов в именах полей – Josh

ответ

4

Просто делать расчеты самостоятельно:

update [EXAMPLE] 
set [Calc A] = A - B, 
    [Calc B] = (A - B)/D, 
    [Calc C] = B/((A - B)/D) 
+0

Спасибо за ответ. Да, это работает. Однако во многих случаях, как это, каждый отдельный расчет может быть очень сложным и длительным, и простое вычисление независимо приводит к некоторым ОЧЕНЬ ОЧЕНЬ ОЧЕНЬ длинным вычислениям. Есть ли у вас другие предложения? – Josh

+0

Я предлагаю вам использовать триггер. сделать расчет один раз и повторно использовать для других столбцов, – GurV

+0

Я никогда не делал этого раньше. Можете ли вы привести пример? – Josh

0

Я действительно нашел решение этой проблемы с помощью локальных переменных в формулировках SET. Смотри ниже.

UPDATE [EXAMPLE] 
SET [Calc A] = @calc_a : = A - B 
    , [Calc B] = @calc_b := @calc_a/D 
    , [Calc C] = B/@calc_b 
+0

Это не должно работать, так как не уверен, в каком порядке столбца будет вызываться операция установки. MySQL задокументировал это очень четко. – GurV

+0

@GurV Вы можете уточнить? Я точно не понимаю, что вы подразумеваете под этим? Вы говорите, что инструкции SET не обязательно будут происходить последовательно? то есть операция может выполняться как CalcC, CalcA, а затем CalcB, в отличие от CalcA, CalcB, а затем CalcC? – Josh