2015-02-23 2 views
0

Мне нужно обновить несколько столбцов в таблице с несколькими условиями.Как обновить несколько столбцов с несколькими условиями

Например, это мой запрос

update Table1 
set weight= d.weight, 
    stateweight=d.stateweight, 
    overallweight=d.overallweight 
from 
    (select * from table2)d 
     where table1.state=d.state and 
      table1.month=d.month and 
      table1.year=d.year 

Если таблица соответствует все три столбца (государственный, месяц, год), он должен обновить только вес колонки и если она соответствует (состояние, год) он должен обновить только столбец stateweight и если она соответствует (год) он должен обновить только overallweight колонка

Примечание: я не могу написать UPDA т.е запрос для каждого состояния отдельно, поскольку его огромный select

Table1

Year Month State Weight StateWeight Overweight 
2014 1  AA 0.00 0.00  0.00 
2014 3  AA 0.00 0.00  0.00 
2014 1  AB 0.00 0.00  0.00 
2014 2  AB 0.00 0.00  0.00 
2014 3  AC 0.00 0.00  0.00 
2014 1  DD 0.00 0.00  0.00 

Table2

Year Month State Weight StateWeight Overweight 
2014 1  AA 2.20 5.00  2.22 
2014 2  AA 1.70 5.00  2.22 
2014 3  AA 8.30 5.00  2.22 
2014 1  AB 5.80 2.11  2.22 
2014 2  AB 7.40 2.11  2.22 
2014 3  AB 9.10 2.11  2.22 
2014 1  AC 3.42 5.14  2.22 
2014 1  DD 8.88 9.00  2.22 

Мой результат должен быть (My Обновлено Table1 должно быть)

Year Month State Weight StateWeight Overweight 
2014 1  AA 2.20 5.00  2.22 
2014 3  AA 8.30 5.00  2.22 
2014 1  AB 5.80 2.11  2.22 
2014 2  AB 7.40 2.11  2.22 
2014 3  AC 0.00 0.00  2.22 
2014 1  DD 0.00 9.00  2.22 

но запрос, который вы указали, был обновлен только с избыточным столбцом, а не с другим столбцом 2 (w восемь & StateWeight)

ответ

1

Вы можете выполнить это, изменив критерии в предложении where и добавив операторы case к обновлению.

Вот пример:

with 
cte as ( select  t1.Year, 
         t1.Month, 
         t1.State, 
         Weight  = MAX(case 
               when t1.State = t2.State and t1.Month = t2.Month 
               then t2.Weight 
               else t1.Weight 
              end), 
         StateWeight = MAX(case 
              when t1.State = t2.State and t1.Month = t2.Month 
              then t2.StateWeight 
              else t1.StateWeight 
             end), 
         Overweight = MAX(t2.Overweight) 
      from  Table1 as t1 
      inner join Table2 as t2 on t1.Year = t2.Year 
      group by t1.Year, t1.Month, t1.State) 
update  t1 
set   Weight = tv.Weight, 
      StateWeight = tv.StateWeight, 
      Overweight = tv.Overweight 
from  Table1 as t1 
inner join cte  as tv on t1.Year = tv.Year 
          and t1.Month = tv.Month 
          and t1.State = tv.State; 
+0

Sry за задержку обновления он обновляет только overallweight колонку, а не другие 2 колонки были обновлены ... Просьба помочь мне ... –

+0

Hi @SathishA, пожалуйста, вы можете обновите свой вопрос, чтобы включить определение Таблицы 1 и Таблицы 2, а также укажите некоторые примеры данных, которые будут содержаться в каждой таблице? – animateme

+0

Привет @SathishA, я обновил свой ответ на основе дополнительной информации, которую вы предоставили. – animateme

Смежные вопросы