#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;