2016-03-19 15 views
0

次のシナリオでは、sqlが必要です。他の列に基づいて同じ行を更新する

私はいくつかの選択された行を持っています。フィルタ処理後例えば

、 フィールドテーブル、私は次の値

Id | yearId 
1 | 1 
1 | 2 
1 | 3 
1 | 4 
1 | 5 

をフィルタ処理しました、私は内側の既存のテーブルに参加するやっている、

は以下を持つフィールドテーブルを考えてみましょう列

ID、yearid、値1、値、値3、 value4、NextYearValue、PreviousYearValue

は私が

value2 = value2 + value1 
value3 = value2 + value3 
value4 = value3 + value2 
NextYearValue = Value2 + value3 + value4 
PreviousYearValue = NextYearValue (should be taken from the previous year value) 

値3は計算値2 +をvalue1

value4更新されます必要があります値3と後に更新値2を取得する必要があり、内部にはテーブルと結合し、以下のように更新する必要があります行う必要があります計算後の値2 NextYearValueは、すべてのudpated値を取得する必要があります。

PreviousYearValueはupdate文の代入の右辺がで修正される前に評価され

+0

を使用する必要があるため、物事は私が何をしたいことは、あなたが提供した例よりも複雑であると思われる、より複雑な取得します。より具体的になりますか? – xpy

+0

優秀..あなたは正しく推測しました。私は更新します。待ってください。 –

+0

質問が更新されました。それを見てください。 –

答えて

0

(それは私が考えるこのシナリオでは、前の行を意味する)は前年から 値を更新値を取得する必要があります同じステートメント内の他の割り当て。ただ、両方の式に同じ計算を適用し、[OK]をする必要があります:あなたが最初の値と同じように

UPDATE @Tbl 
SET value1 = value1 + value1, 
     value2 = value1 + value1 
+0

これは、1つまたは2つの列でOKです。私はほぼ7から8列を更新する必要があります。代替と効率的な方法はありますか? –

+0

@ JeevaJsbテーブルに主キーなどがありますか? – Mureinik

0
Update @Tbl 
    set value1=value1+value1 
update @Tbl set value2=value1 
2

どちらか一方のフィールドを同じように設定するか、または2回の更新を行います。

Update @Tbl 
set value1=value1+value1, 
value2=value1+value1 

これは基本的に正しいことですか?

あなたはこれを行うことができることをやるカント何らかの理由の場合:

Update @Tbl 
set value1=value1+value1 

Update @Tbl 
set value2=value1 

ものの2回の通話のthatsそれが何らかの理由でこれが十分でない場合、私は

をするだろうものではありませんので、あなたはあなたの事を詳しく説明できますか?同じ値を持つ2つの列を持つことは奇妙なことです。

1

私は2つのアプローチを思いつきましたが、どちらが速いのか分かりません。

あなたの計算が複雑ではないので、あなただけの数学行うことができます。のMySqlアプローチで

UPDATE FieldTable SET 
value2 = value1 + value2 
value3 = value1 + 2*value2 + value3 
value4 = 2*value1 + 4*value2 + 2*value3 
NextYearValue = 4*value1 + 7*value2 + 3*value3 
PreviousYearValue = NextYearValue 

を、あなただけの変数を使用することができます。

というあなた、もちろん考慮
UPDATE FieldTable 
JOIN 
(
    SELECT 
    id, 
    @uvalue2 :=value2 + value3 uvalue2, 
    @uvalue3 :[email protected] + value3 uvalue3, 
    @uvalue4 :[email protected] + @uvalue3 uvalue4, 
    @uvalue2 + @uvalue3 + @uvalue4 uNextYearValue, 
    NextYearValue uPreviousYearValue 
    FROM FieldTable 
) as uFieldTable 
ON FieldTable.id = uFieldTable.id 
SET 
value2 = uvalue2, 
value3 = uvalue3, 
value4 = uvalue4, 
NextYearValue = uNextYearValue, 
PreviousYearValue = uPreviousYearValue; 

ユニークなIDを持つSQL Serverの

あなたはおそらくCommon Table Expressions

WITH FieldTable2 AS(
SELECT id, value2 + value3 value2, value3, value4, NextYearValue FROM FieldTable 
) ,FieldTable3 AS(
SELECT id, value2, value3 + value2 value3, value4, NextYearValue FROM FieldTable2 
) ,FieldTable4 AS(
SELECT id, value2, value3, value3 + value2 value4, NextYearValue FROM FieldTable3 
) ,FieldTable5 AS(
SELECT id, value2, value3, value4, value2 + value3 + value4 NextYearValue FROM FieldTable4 
) 
UPDATE FieldTable 
SET 
value2 = FieldTable5.value2, 
value3 = FieldTable5.value3, 
value4 = FieldTable5.value4, 
NextYearValue = FieldTable5.NextYearValue 
FROM 
FieldTable5 
WHERE FieldTable.id = FieldTable5.id 
+0

あなたは適切な答えを与えました..しかし前の年の値は前の年の値から現在の行の値ではなくなります。そしてもう一つの行の値を追加するのを忘れています5 =前年の値+値4 –

+0

2番目の解決策から、アイデア..ありがとうと素晴らしい。病気チェックし、これを答えとしてマークします。 –

+0

@ JeevaJsb悲しいことに、私の答えはmySQLです。私はこれを修正し、答えを変えようとします。 – xpy

関連する問題