2017-01-28 14 views
1

ここでは、UPDATE文で何を達成したいのかを表形式で示しています。MySQL - 前のSET文の結果に依存するSET文によるUPDATEクエリ

+----+----+---+---+----+----------+---------------+---------------+ 
| 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]は、[Calc A]のOLD値を使用して計算し、データベースに書き込んだ新しい更新値は計算しません。これは、[Calc B]のOLD値を再度参照する[Calc C]に当てはまります。

UPDATEステートメントを3回実行すると、データが正しく計算されます。最初の計算で[Calc A]が正しく設定されていると、[Calc B]が2番目のUPDATEで[Calc A]の正しい更新値を参照し、[Calc C]が[Calc B]の正しい値を参照します3回目の更新。

私の質問は、どのようにすべての列を正しい値に設定するのですか?

+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、CalcB、CalcCのように動作する可能性がありますか? – Josh

関連する問題