当前位置: 代码迷 >> Sql Server >> 怎么实现联表更新有相同记录时只更新1条记录
  详细解决方案

怎么实现联表更新有相同记录时只更新1条记录

热度:103   发布时间:2016-04-24 08:51:20.0
如何实现联表更新有相同记录时只更新1条记录
本帖最后由 slelotus 于 2015-09-29 17:40:02 编辑
表testa:
id          aa                   bb
----------- -------------------- --------------------
1           lix                  
2           nek                  
3           nek                  
4           vvb  
表testb:
aa                   bb
-------------------- --------------------
nek                  aaa
vvb                  bbb
现要更新testa表的bb字段为testb表的bb字段,条件是两表的aa相同,但是如果testa的aa有多条记录相同,只更新其中1条的bb即可,更新哪1条没要求,如果用语句update a set a.bb=b.bb from testa a,testb b where a.aa=b.aa,那这样相同记录都会更新,我想要的结果是更新后testa为:
id          aa                   bb
----------- -------------------- --------------------
1           lix                  
2           nek                  aaa
3           nek                  
4           vvb                   bbb

请高手解答啊,能否通过1个语句实现,谢谢了!
------解决思路----------------------
抛块砖 

UPDATE
   a
SET
   a.bb = b.bb
FROM
   [testa] a ,
   [testb] b
WHERE
   a.aa = b.aa
   AND a.id IN ( SELECT
                  id
                 FROM
                  (
                    SELECT
                     aa, MAX(id) AS id
                    FROM
                     [testa]
                    GROUP BY
                     aa
                  ) a )

------解决思路----------------------
奇特的需求,一个SQL语句我搞不定,只能想到如此笨重的方法,期待大神来指教:


create table testa(
id int identity(1,1) primary key,
aa varchar(10),
bb varchar(10)
)

create table testb(
aa varchar(10),
bb varchar(10)
)

insert into testa(aa)
values('lix'),('nek'),('nek'),('vvb')

insert into testb(aa,bb)
values('nek','aaa'),('vvb','bbb')

select 
row_number() over(order by newid()) as new_id,
id,
aa,
bb 
into #a
from testa 


update a set a.bb=c.bb from 
testa a inner join 
(
select a.id,a.aa from #a a inner join 
(
select min(new_id) new_id,aa from #a  group by aa 
) b on a.new_id=b.new_id
) b on a.aa=b.aa and a.id=b.id
inner join testb c on a.aa=c.aa

select * from testa 

/***********
结果
id aa bb
1 lix NULL
2 nek NULL
3 nek aaa
4 vvb bbb
5 lix NULL
6 nek NULL
7 nek NULL
8 vvb NULL

************/


------解决思路----------------------


-- 使用 row_number 函数
create table a(id int , aa varchar(10) , bb varchar(10))
go
insert into a values
(1, 'lix',null),
(2, 'nek',null),
(3, 'nek',null),
(4, 'vvb',null),
(5, 'vvb',null)
go
create table b(aa varchar(10) , bb varchar(10))
go
insert into b values
('nek', 'aaa'),
('vvb', 'bbb')
go
select * from a 
go
select * from b 
go
with m as (
select a.* , row_number() over(partition by aa order by id) rn from a 
)
update m set bb = b.bb 
from m , b 
where m.rn = 1 and m.aa = b.aa
go
select * from a 
go
drop table a ,b 
go



(5 行受影响)

(2 行受影响)
id          aa         bb
----------- ---------- ----------
1           lix        NULL
2           nek        NULL
3           nek        NULL
4           vvb        NULL
5           vvb        NULL

(5 行受影响)

aa         bb
---------- ----------
nek        aaa
vvb        bbb

(2 行受影响)


(2 行受影响)
id          aa         bb
----------- ---------- ----------
1           lix        NULL
2           nek        aaa
3           nek        NULL
4           vvb        bbb
5           vvb        NULL

(5 行受影响)


  相关解决方案