2016-04-13 3 views
2

У меня есть две таблицы:T-SQL обновление присоединиться 1: N

TABLE1:

id fee1 fee2 
1 0.00 0.00 
2 0.00 0.00 

Table2:

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 обновляется только fee1 из table1, а fee2 - нет. Наконец, я использовал два оператора SQL для обновления fee1 и fee2 соответственно.

Но почему этот оператор SQL не работает?

Вот создать таблицу заявление:

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

Ваше обновление читает 'случай, когда B'' c.fee_no = 'но там нет псевдонима таблицы' c' назначен в запросе? – Raj

+0

извините, это клерикальная ошибка. Я исправлю это – zhangsir199

+0

Можете ли вы разместить свой SQL? Уверен, что второе обновление для 'fee2' обновило неверные значения – Raj

ответ

2

Проблема с запросом в том, что каждая строка table1 обновляется дважды. Однако, когда второе обновление имеет место, оно работает с данными данных таблицы. Итак, fee2 установлен на 0.

Чтобы правильно 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'? в чем разница между 'feel' и' fee2' в 'update' и' select' query? – zhangsir199