日期:2014-05-17  浏览次数:20323 次

请教一个很少用到的单表操作SQL语句
举例如下
CREATE TABLE #AA(uid int IDENTITY, a varchar(5),b varchar(6))

INSERT INTO #AA (a,b)
select 'A158','AAAA' UNION ALL
select '','AABBA' UNION ALL
select '','AAXA' UNION ALL
select '','AACA' UNION ALL
select 'A159','AAAA' UNION ALL
select '','AABBA' UNION ALL
select '','AAXA' UNION ALL
select '','AACA' UNION ALL
select 'A168','AAAA' UNION ALL
select '','AABBA' UNION ALL
select '','AAXA' UNION ALL
select '','AACA' UNION ALL
select 'A178','AAAA'

我需要更新a列为空的行,数据取得逻辑就是小于(用uid做为参考)自己并且离自己最近的,a列不空的数据?如何处理
SQL

------解决方案--------------------
CREATE TABLE #AA(uid int IDENTITY, a varchar(5),b varchar(6))
INSERT INTO #AA (a,b)
select 'A158','AAAA' UNION ALL
select '','AABBA' UNION ALL
select '','AAXA' UNION ALL
select '','AACA' UNION ALL
select 'A159','AAAA' UNION ALL
select '','AABBA' UNION ALL
select '','AAXA' UNION ALL
select '','AACA' UNION ALL
select 'A168','AAAA' UNION ALL
select '','AABBA' UNION ALL
select '','AAXA' UNION ALL
select '','AACA' UNION ALL
select 'A178','AAAA'

select * from #AA

update t1
set a=(select top 1 a from #AA t2 where t2.uid<=t1.uid and t2.a<>'' order by a desc)
from #AA t1

select * from #AA
drop table #AA

/*
1 A158 AAAA
2 A158 AABBA
3 A158 AAXA
4 A158 AACA
5 A159 AAAA
6 A159 AABBA
7 A159 AAXA
8 A159 AACA
9 A168 AAAA
10 A168 AABBA
11 A168 AAXA
12 A168 AACA
13 A178 AAAA
*/