2016-04-13 15 views
2

Iは、2つのテーブルを有する:表2T-SQLの更新1の参加:N

id fee1 fee2 
1 0.00 0.00 
2 0.00 0.00 

表1

id fee_no fee 
1 A  10.00 
1 B  20.00 
2 A  80.00 
2 B  90.00 

SQL:

update a 
    set a.fee1 = isnull(a.fee1, 0) 
       + (case when b.fee_no ='A' 
         then cast(isnull(b.fee, 0) as decimal(30, 2)) 
         else 0 end), 
     a.fee2 = isnull(a.fee2, 0) 
       + (case when b.fee_no ='B' 
         then cast(isnull(b.fee, 0) as decimal(30,2)) 
         else 0 end) 
    from table1 a 
inner join table2 b on a.id = b.id 

このSQLを実行した後、fee2table1fee1のみが更新されます。最後に、2つのSQL文を使用してそれぞれfee1fee2を更新しました。

しかし、なぜこのSQL文は機能しませんか?ここで

は、create table文である:

create table table1(
id int  null, 
fee1 dec(30,2) null, 
fee2 dec(30,2) null 
) 
insert into table1 (id,fee1,fee2) 
select 1,0,0 union 
select 2,0,0 

create table table2(
id  int   null, 
fee_no varchar(10) null, 
fee  dec(30,2) null 
) 
insert into table2 (id,fee_no,fee) 
select 1,'A',10 union 
select 1,'B',20 union 
select 2,'A',80 union 
select 2,'B',90 
+2

をあなたの更新は 'ケースc.fee_no = 'B''を読み取りますが、あなたのクエリに割り当てられたテーブルの別名' C 'がありませんか? – Raj

+0

申し訳ありませんが、それは事務的なエラーです。私はそれを修正しました – zhangsir199

+0

あなたのSQLを投稿できますか?私は 'fee2'の2番目の' update'が間違った値を更新したと確信しました – Raj

答えて

2

クエリに問題がtable1の各行が2回更新されていることです。しかし、2回目の更新が行われるときには、オリジナルのテーブルのデータで動作します。したがって、fee20に戻されます。

が適切UPDATEあなたはこのようなクエリを必要に:

update a 
    set a.fee1 = isnull(a.fee1, 0) 
       + (case when b.fee_no ='A' 
         then cast(isnull(b.fee, 0) as decimal(30, 2)) 
         else 0 end), 
     a.fee2 = isnull(a.fee2, 0) 
       + (case when c.fee_no ='B' 
         then cast(isnull(c.fee, 0) as decimal(30,2)) 
         else 0 end) 
from table1 a 
inner join table2 b on a.id = b.id and b.fee_no = 'A' 
inner join table2 c on a.id = c.id and c.fee_no = 'B' 
+0

なぜ 'fee1'でも同じことが起きなかったのですか? 'update'と' select'クエリの 'feel'と' fee2'の違いは何ですか? – zhangsir199