更新相同键的行值

时间:2018-09-05 20:00:49

标签: sql sql-server

我有一个表,其中有两种类型的id和一个值。我需要用相同id的值更新所有为null的值。例如

输入

aid   no     bid
A      1     1
A      2     NULL
A      3     NULL
B      1     NULL
B      2     2
B      3     NULL

在上表中,我需要更新以A作为键的所有行的A的值1,而对于B我需要更新所有以键B的行的A的值1。

输出

A   1   1
A   2   1
A   3   1
B   1   2
B   2   2
B   3   2

我正在使用临时表来执行此操作,是否有一种更简单的方法可以不使用临时表来执行此操作?

select bid, aid  
into #tempbidNULL 
from table_name 
where bid is null and aid is not null

select bid, aid 
into #tempbidNOTNULL 
from table_name where bid is not null 
 and aid in (select aid from #tempbidNULL)

update table_name 
set bid = b.bid
from table_name x 
join #tempbidNOTNULL y on x.aid = y.aid
where x.bid IS NULL
where y.bid IS NOT NULL

2 个答案:

答案 0 :(得分:2)

我将使用窗口功能:

with toupdate as (
      select t.*, max(val2) over (partition by col1) as new_val2
      from table_name 
     )
update toupdate
     set val2 = new_val2
     where val2 is null;

答案 1 :(得分:0)

UPADTE table_name
SET b_id=CASE a_id WHEN 'A' THEN 1 WHEN 'B' THEN 2 END
WHERE b_id is null AND a_id is not null