2017-06-09 8 views
-1

こんにちは私は少し質問を実行すると、SQL Serverの動作を表示するのは混乱しています。鉱山によると、出力は更新中のSqlサーバーの問題

Declare @temp table(
Name Varchar(50), 
amount int 
) 

insert @temp values ('Priyanka' ,10) 

Update @temp 
set amount=amount-A.a 
from (
select 'Priyanka' as Name,1 as a 
union 
select 'Priyanka' as Name,5 as a 
)A 
where [@temp].Name in (A.Name) 

select * from @temp 

4しかし 出力

Name amount 
Priyanka 9 

これが起こっている理由いずれかを教えてくださいすることができ、「して、Priyanka」でなければなりません。

答えて

0

標準SQLはupdatefrom節をサポートしておらず、代わりにset節に直接サブクエリとして他のテーブルへのアクセス権を書き込む必要があります。もしあなたがそうしたなら、あなたは "サブクエリは複数の値を返しました"というエラーを受け取り、その問題の考えを持っています。

残念ながら、FROM句もになるようにするMicrosoftの拡張機能は、複数の行が一致する可能性があるという事実を無視し、それらの行の1つを使用して他の行を無視します。

この拡張機能を使用する場合は、ターゲット表の1つの行に複数の一致がないように注意してください。

私はあなたのクエリ、のようなものを並べ替えたい:私は、ターゲット行ごとに単一の行までのデータを集計するcross applyを使用

Declare @temp table(
Name Varchar(50), 
amount int 
) 

insert @temp values ('Priyanka' ,10) 

;With A as 
(
select 'Priyanka' as Name,1 as a 
union 
select 'Priyanka' as Name,5 as a 
) 
Update t 
set amount=amount-Aa.a 
from 
    @temp t 
     cross apply 
    (select SUM(a) as a from A where Name = t.Name) Aa 

select * from @temp 


は重要なこと、しかし、それは(その内および列)すべての行が並行して更新されている「あるかのように」 UPDATEの効果が適用されているという概念をサポートしています。だから を取得しないでください。最初に更新を適用すると、1つの行を使用し、2番目の更新プログラムは、更新済みの行を更新します。

+0

しかし、先生たちは、XMLから読み込まれ、その後、何の問題のテーブルを更新していないとき。 –

+0

私は少し混乱しています。私はこのコンセプトをどこから理解できるかを参考にしてください。 –

0

ユニオンエントリの値をSUMする必要があります。エントリに複数のエントリが含まれている場合は、そのエントリをUNIONするだけで、エントリを1つ取って残りを無視することができます。あなたのケースでは

は、次のクエリは動作します:

DECLARE @temp TABLE (NAME VARCHAR(50), amount INT) 

INSERT @temp 
VALUES ('Priyanka', 10) 

UPDATE t 
SET amount = t.amount - A.a 
FROM @temp t 
JOIN (
    SELECT NAME, SUM(a) AS a FROM (
     SELECT 'Priyanka' AS NAME, 1 AS a 
     UNION 
     SELECT 'Priyanka' AS NAME, 5 AS a 
     ) c 
    GROUP BY NAME 
    ) A ON A.NAME = t.NAME 

SELECT * FROM @temp 
+0

しかし、私たちがselectではなくXMLから読むと、私にとってうまくいっています。 –