MySQL - 如何为复杂的相关计算编写UPDATE查询

时间:2017-01-29 01:35:37

标签: mysql sql-update

以下是我希望使用UPDATE语句实现的表格。

+----+----+---+---+----+----------+----------+----------+
| ID | A  | B | C | D  |  CalcA   |  CalcB   |  CalcC   |
+----+----+---+---+----+----------+----------+----------+
|  1 |  6 | 5 | 2 | 10 | =See SQL | =See SQL | =See SQL |
|  2 |  8 | 5 | 2 | 10 | =See SQL | =See SQL | =See SQL |
|  3 | 10 | 5 | 2 | 10 | =See SQL | =See SQL | =See SQL |
+----+----+---+---+----+----------+----------+----------+

实现此目的的当前UPDATE语句如下......

UPDATE EXAMPLE
SET CalcA    = CASE A WHEN A - B THEN A + C WHEN C - D THEN A + B + C - D WHEN 3 THEN A * (B + C) WHEN 5 THEN A * D END
    , CalcB  = CalcA * 2 + (A + B + C + D) * 542 + (D * C) + A * 27
    , CalcC  = CalcB + A + B - C - D * 10   

现在,当前形式的计算不会在一次执行中正确设置所有列,因为它们依赖于前一次计算的结果。

要纠正这个问题,我可以单独完成所有计算。即......

UPDATE EXAMPLE
    SET CalcA    = CASE A WHEN A - B THEN A + C WHEN C - D THEN A + B + C - D WHEN 3 THEN A * (B + C) WHEN 5 THEN A * D END
        , CalcB  = (CASE A WHEN A - B THEN A + C WHEN C - D THEN A + B + C - D WHEN 3 THEN A * (B + C) WHEN 5 THEN A * D END) * 2 + (A + B + C + D) * 542 + (D * C) + A * 27
        , CalcC  = ((CASE A WHEN A - B THEN A + C WHEN C - D THEN A + B + C - D WHEN 3 THEN A * (B + C) WHEN 5 THEN A * D END) * 2 + (A + B + C + D) * 542 + (D * C) + A * 27) + A + B - C - D * 10   

但是,正如您所看到的,这会导致一些非常长的计算,这些计算容易出错并且难以检查。

所以我的问题是如何在没有这些极长的SET计算的情况下让这些计算在一个更新语句中正常工作?

0 个答案:

没有答案