当前位置: 代码迷 >> Sql Server >> 用不含"0"值邻近行,替换含"0"值行
  详细解决方案

用不含"0"值邻近行,替换含"0"值行

热度:24   发布时间:2016-04-24 09:20:53.0
用不含"0"值相邻行,替换含"0"值行?
我想替换表中Val1列含有"0"值的行,用最近一行不含"0"的来替换。如下表中Val1列值在ID是4、5、6、7的值都是"0"值,此四个值都替换为ID为3的值“11248”。 我的数据表,ID列是自增列,第一行也就是ID是1的行是没有"0"值的,"0"值在表中分布没有规律.
表如下:
drop table  #G_Goods
CREATE TABLE #G_Goods
( ID [int] IDENTITY(1,1) NOT NULL, Val1 [int], Val2 [int], Val3 [int]);INSERT INTO #G_Goods (Val1, Val2, Val3)

select 11250,11260,258  UNION ALL
select 11255,11257,74  UNION ALL
select 11248,11250,94  UNION ALL
select 0,11254,85  UNION ALL
select 0,0,88  UNION ALL
select 0,11260,126  UNION ALL
select 0,11262,60  UNION ALL
select 11260,11272,0  UNION ALL
select 11267,11282,168  UNION ALL
select 11277,11286,160  UNION ALL
select 0,11292,178  UNION ALL
select 11283,11285,173  UNION ALL
select 11284,11302,100  UNION ALL
select 11289,11292,127  UNION ALL
select 11291,11295,118  UNION ALL
select 0,11309,527  UNION ALL
select 11294,11308,199  UNION ALL
select 11307,11316,73  UNION ALL
select 11314,0,223  UNION ALL
select 11331,0,192  UNION ALL
select 11322,0,219  UNION ALL
select 11316,0,127  UNION ALL
select 11315,11319,118  UNION ALL
select 11321,11324,86  UNION ALL
select 11303,11305,140  UNION ALL
select 11294,11301,190  UNION ALL
select 0,11290,157  UNION ALL
select 0,11299,277  UNION ALL
select 11284,11284,219  UNION ALL
select 11280,11287,238  UNION ALL
select 11285,11294,91  UNION ALL
select 11291,11302,118;

想原表替换后,得到如下的结果:
ID Val1 Val2 Val3
1 11250 11260 258
2 11255 11257 74
3 11248 11250 94
4 11248 11254 85
5 11248 0 88
6 11248 11260 126
7 11248 11262 60
8 11260 11272 0
9 11267 11282 168
10 11277 11286 160
11 11277 11292 178
12 11283 11285 173
13 11284 11302 100
14 11289 11292 127
15 11291 11295 118
16 11291 11309 527
17 11294 11308 199
18 11307 11316 73
19 11314 0 223
20 11331 0 192
21 11322 0 219
22 11316 0 127
23 11315 11319 118
24 11321 11324 86
25 11303 11305 140
26 11294 11301 190
27 11294 11290 157
28 11294 11299 277
29 11284 11284 219
30 11280 11287 238
31 11285 11294 91
32 11291 11302 118

下面是我用其他人提供的查询语句,但是太慢了,我的七万行数据,其中Val1含"0"值有八行,替换八行的用时是45秒。有更快的吗?
update a
 set a.Val1=case when a.Val1<>0 then a.Val1 
               else (select top 1 b.Val1 
                     from #G_Goods b 
                     where b.ID<a.ID and b.Val1<>0 
                     order by b.ID desc) end        
 from #G_Goods a
------解决思路----------------------
SQL2005+的语法
UPDATE T1
SET Val1=T3.Val1
FROM #G_Goods T1
CROSS APPLY(SELECT TOP 1 Val1 FROM #G_Goods T2 WHERE T1.ID>=T2.ID AND T2.Val1>0 ORDER BY T2.ID DESC)T3
WHERE T1.Val1=0


如果是SQL2000,我想,可以直接加个条件WHERE Val1=0 也会快很多
  相关解决方案