2017-03-22 2 views
1

UPDATEステートメントを作成するとき、+ =を使用すると、いずれかの側に列を追加し、左側の列に保存すると考えました。これは、SELECTステートメントと変数ではなく、UPDATEステートメントの列では機能しないようです。TSQLでは、列で+ =を使用してUPDATEを実行しても、後続の値が追加されないのはなぜですか?

更新ステートメントは、CROSS JOINからの最小値を選択してその操作を実行するだけですが、値(2,3,4)を含む残りの行を無視しているようです。私は最後のSELECTが@Val = 10、Val = 10を返すと思っていたでしょう

なぜ値(2,3,4)がUPDATE文の列に追加されませんか?何をしたい

SELECT 0 AS Val INTO #MyTable 

DECLARE @Val AS INT = 0 

UPDATE MyTable 
SET MyTable.Val += TableValues.AddVal 
FROM #MyTable MyTable 
    CROSS JOIN (
     SELECT  1 AS AddVal 
     UNION SELECT 2 AS AddVal 
     UNION SELECT 3 AS AddVal 
     UNION SELECT 4 AS AddVal 
    ) TableValues 

SELECT @Val += TableValues.AddVal 
FROM #MyTable MyTable 
    CROSS JOIN (
     SELECT  1 AS AddVal 
     UNION SELECT 2 AS AddVal 
     UNION SELECT 3 AS AddVal 
     UNION SELECT 4 AS AddVal 
    ) TableValues 

SELECT @Val AS [@Val], * FROM #MyTable 

DROP TABLE #MyTable 
+2

更新はループではありません - あなたは、選択から値を更新するためにそれを告げたではなく、あなたがしたい値のそれを言いましたそれはselect - > 0 + 1 = 1から戻って来る最初の値を加えることによって機能します。それはあなたが 'SUM'を望むように聞こえます:) – Bridge

+0

@Bridge、私はSELECTとUPDATEが同様のファッション。私はSELECTの '@Val'をUPDATEのMYTable.Valに相当するものと見ます。値を足し合わせることで、クエリの内容は変わりませんが、UPDATEとSELECTの動作に違いがある理由はわかりません。 –

答えて

1

は、すべての値を追加し、他のテーブルに必要な列に追加しSUMです。あなたのケースで効果的である

update MyTable 
set MyTable.Val = MyTable.Val + TableValues.AddVal 
from #MyTable MyTable 
cross join (
    select sum(AddVal) as AddVal 
    from (
     select 1 as AddVal 
     union 
     select 2 as AddVal 
     union 
     select 3 as AddVal 
     union 
     select 4 as AddVal 
     ) t 
    ) TableValues 

update #MyTable 
set Val = Val + 10 
+0

私はSUMがうまくいくことは知っていますが、私はなぜ変数をSELECTを使って私が期待しているものの、UPDATEに出力しないのかを理解しようとしています。 –

+1

理由は、@Bridgeが上記のコメントに記載されているからです。 – GurV

+0

@ GurVそれは、彼が理解しようとしている問題を解決する方法を本当に求めていないと思うのですが、なぜSQLはSelectとUpdateの違いが違いますか?彼らが別々に働いていることは予想外です。 – Jessycormier

関連する問題