回 帖 发 新 帖 刷新版面

主题:[原创]CSDN 发布的2009年度最难SQL 代码题!

表 userinfo 有两个字段 username (主键,VARCHAR型) ,user_id(INT型)。
 
    现想将表中所有以jhb 结尾的 记录的 user_id 值替换成username 前半部分与其相同并且最后3个字符是zzb的记录的user_id 的值(如下例中123zzb与123jhb 以及abd5234zzb与abd5234jhb)。

举例:(左侧为原表,右侧为更新后)


username       user_id

123zzb          88
123jhb          77
77894qsd          22365
abd5234zzb          44
abd5234jhb          369  


更新后:


username       user_id

123zzb          88
123jhb          88
77894qsd          22365
abd5234zzb          44
abd5234jhb          44  



123jhb 与123zzb 就最后3位字符串不一样,并且123zzb最后3位是zzb,更新后,应该使得123jhb 的user_id 的值= 123zzb 的user_id 的值。abd5234zzb 以及 ab5234jhb也是一样,更新后,ab5234jhb的user_id 的值应该等于abd5234zzb的user_id的值。 请问如何使用sql 代码实现?允许新增表操作。

请高手解答这一2009年度难题。

回复列表 (共2个回复)

沙发

我估计应该是你自己的问题吧。
应该是你的存储过程出了问题。看是不是给更新后没有变的变量赋值的时候变量名写错了!
最好在更新时添加一个判断
比如这样
if exists
 select from 表名 旧user_id=新user_id from 新表 
 return 0

else  return 1

板凳

declare @t table(username varchar(50),userid int)
insert into @t
select '123zzb',88
union all 
select '123jhb',77
union all
select '77894qsd',22365
union all
select 'abd5234zzb',44
union all
select 'abd5234jhb',369

select * from @t

select *,substring(username,1,len(username)-3) as tt into #tt
from @t
where patindex('%jhb%',username)>0

select username as a,userid as b ,aa=(select userid from @t b  
          where b.username not in (select username from #tt) 
          and substring(a.username,1,len(a.username)-3)=substring(b.username,1,len(b.username)-3)) 
into #dd
from @t a
where patindex('%jhb%',username)=0

update @t
set userid=(select b from #dd where substring(a,1,len(a)-3)=substring(username,1,len(username)-3))
where patindex('%jhb%',username)>0

select * from @t

drop table #tt
drop table #dd

我来回复

您尚未登录,请登录后再回复。点此登录或注册