Таблица обновления по сравнению с другой таблицей

#sql #sql-server #tsql

Вопрос:

Таблица 1

Онемевший Гонорар Плата за 1 Fee2
101 10 20 30

Таблица 2

Онемевший Гонорар Плата за 1 Fee2
101 50 нулевой нулевой
101 нулевой 20 нулевой
101 нулевой нулевой 30
101 нулевой нулевой нулевой

Я хочу обновить таблицу 1 по сравнению с таблицей 2 для всех сборов,сборов 1 и сборов 2 до нуля, потому что в таблице 2 уже есть значения.

Я пытался

 update m set
    m.Fee = case when l.fee is not null then null else m.fee end
    , m.fee1 = case when l.fee1 is not null then null else m.fee1 end
    , m.fee2 = case when l.fee2 is not null then null else m.fee2 end
from table1 m
Join table2 l on m.Numb = l.Numb;
 

Я попробовал выше инструкцию update, но я получаю значения в таблице 1, но я хочу null.

Я хочу, чтобы результат был таким

Таблица 1

Номер Гонорар Плата за 1 Fee2
101 нулевой нулевой нулевой

Комментарии:

1. Может быть, вы думаете, что вопрос ясен… но это не так. Почему вы используете псевдоним m в своем предложении об обновлении, если в ваших таблицах нет псевдонима m?

2. Теперь все ясно..

3. По крайней мере, для меня… ещё нет. Что вы имеете в виду, говоря: «Я хочу обновить таблицу 1 по сравнению с таблицей 2,чтобы все сборы, сборы 1 и сборы 2 были равны нулю, потому что в таблице 2 уже есть значения».

4. Когда таблица 1 сравнивается с таблицей 2, если у нас есть значения, это таблица 2, то нам нужно обновить таблицу 1 как нулевую

Ответ №1:

Может быть, это могло бы сделать то, что ты хочешь

 update m
set 
  Fee = null,
  Fee1 = null,
  Fee2 = null
from table1 m
where 1 = (
  select 
    case 
      when 
        max(isnull(l.Fee,-1)) <> -1 and
        max(isnull(l.Fee1,-1)) <> -1 and 
        max(isnull(l.Fee2,-1)) <> -1
        then 1
      else 0
    end
    from table2 l
    where l.Numb = m.Numb
    group by l.Numb
)
 

Комментарии:

1. Поскольку NULL «тип данных» может быть недопустим для агрегации, я заменил его на -1 в сравнении.

Ответ №2:

Соединяя таблицы, ваше выражение case вычисляется для всех строк, что вам не нужно; Я думаю, вам нужно использовать exists

 update t1 set
    t1.fee= Iif(exists (select * from table2 t2 where t2.Numb=t1.Numb and t2.fee  is null), t1.fee,  null) 
    t1.fee1=Iif(exists (select * from table2 t2 where t2.Numb=t1.Numb and t2.fee1 is null), t1.fee1, null) 
    t1.fee2=Iif(exists (select * from table2 t2 where t2.Numb=t1.Numb and t2.fee2 is null), t1.fee2, null) 
from table1 t1
 

Ответ №3:

Попробуйте сделать это с тем же подходом, примените фильтр предложений where, если требуется.

 update m set
    m.Fee = case when l.fee is not null then null else l.fee end
    , m.fee1 = case when l.fee1 is not null then null else l.fee1 end
    , m.fee2 = case when l.fee2 is not null then null else l.fee2 end
from table1 m
Join table2 l on m.Numb = l.Numb
--    Where (l.fee is null or l.fee1 is null or l.fee2 is null)
 

Ответ №4:

Я мог бы предложить объединить table2 и использовать это для update :

 update m
    set fee = (case when l.fee is null then m.fee end),
        fee1 = (case when l.fee1 is null then m.fee1 end),
        fee2 = (case when l.fee2 is null then m.fee2 end)
from table1 m join
     (select l.numb, max(fee) as fee, max(fee1) as fee1, max(fee2) as fee2
      from table2 l
      group by l.numb
     ) l
     on m.Numb = l.Numb;