请教一条update语句的写法。

myperry 2006-02-11 09:22:44
表TABLE1的内容如下:
说明:
1、aaa+bbb是主键值, ccc,ddd是int型
2、aaa+bbb以升序方式排列。
aaa, bbb, ccc, ddd
001 B001 102 100
001 B002 0 90
001 B003 0 89
001 B004 0 87
001 B005 0 87
001 B006 0 85
001 B007 0 83

002 B001 234 230
002 B003 0 210
002 B005 0 208
002 B006 0 206
002 B007 0 199
002 B008 0 199
002 B009 0 180

003 B001 140 130
003 B004 0 109
003 B005 0 108
003 B008 0 103
003 B009 0 98
003 B010 0 98
003 B017 0 98
......


需要通过update得到的内容如下:
1、当aaa字段值相同时,用前一条记录的ddd字段值,更新当前记录的ccc字段值。
2、在每一组aaa记录中,以bbb字段值的大小,确定两条记录的前后顺序。
3、每一组aaa记录中,第一条记录的ccc值不用更新。

aaa, bbb, ccc, ddd
001 B001 102 100
001 B002 100 90
001 B003 90 89
001 B004 89 87
001 B005 87 87
001 B006 87 85
001 B007 85 83

002 B001 234 230
002 B003 230 210
002 B005 210 208
002 B006 208 206
002 B007 206 199
002 B008 199 199
002 B009 199 180

003 B001 140 130
003 B004 130 109
003 B005 109 108
003 B008 108 103
003 B009 103 98
003 B010 98 98
003 B017 98 98
......

...全文
170 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
myperry 2006-02-12
  • 打赏
  • 举报
回复
综合以上两位高手的写法,正确的写法应该是:

update @t set ccc=isnull((select top 1 ddd from @t where aaa=T.aaa and bbb<T.bbb order by bbb DESC),t.ccc)
from
@t T

再次感谢
scmail81(琳·风の狼)
samfeng_2003(凤翼天翔)
myperry 2006-02-12
  • 打赏
  • 举报
回复
综合以上两位高手的写法,正确的写法应该是:

update @t set ccc=isnull((select top 1 ddd from @t where aaa=T.aaa and bbb<T.bbb order by bbb DESC),a.ccc)
from
@t T

再次感谢
scmail81(琳·风の狼)
samfeng_2003(凤翼天翔)
$扫地僧$ 2006-02-11
  • 打赏
  • 举报
回复
declare @t table
(aaa varchar(20),bbb varchar(20),ccc int,ddd int)

insert @t
select '001','B001',102,100 union all
select '001','B002',0,90 union all
select '001','B003',0,89 union all
select '001','B004',0,87 union all
select '001','B005',0,87 union all
select '001','B006',0,85 union all
select '001','B007',0,83 union all
select '002','B001',234,230 union all
select '002','B003',0,210 union all
select '002','B005',0,208 union all
select '002','B006',0,206 union all
select '002','B007',0,199 union all
select '002','B008',0,199 union all
select '002','B009',0,180 union all
select '003','B001',140,130 union all
select '003','B004',0,109 union all
select '003','B005',0,108 union all
select '003','B008',0,103 union all
select '003','B009',0,98 union all
select '003','B010',0,98 union all
select '003','B017',0,98

update @t set ccc=case when ccc>0 then ccc else (select top 1 ddd from @t where aaa=T.aaa and bbb<T.bbb order by bbb DESC) end
from
@t T


select * from @t
myperry 2006-02-11
  • 打赏
  • 举报
回复
因为ddd字段的值并不一定是按降序排列的。
所以用min(ddd)找出的结果不一定对。
例如:

declare @t table
(aaa varchar(20),bbb varchar(20),ccc int,ddd int)

insert @t
select '001','B001',102,100 union all
select '001','B002',0,90 union all
select '001','B003',0,99 union all
select '001','B004',0,87 union all
select '001','B005',0,87 union all
select '001','B006',0,85 union all
select '001','B007',0,83 union all
select '002','B001',234,230 union all
select '002','B003',0,210 union all
select '002','B005',0,208 union all
select '002','B006',0,206 union all
select '002','B007',0,199 union all
select '002','B008',0,199 union all
select '002','B009',0,180

select aaa,bbb,ccc=
isnull((select min(ddd) from @t b where a.aaa=b.aaa and a.bbb>b.bbb),a.ccc),ddd from @t a


aaa bbb ccc ddd
-------------------- -------------------- ----------- -----------
001 B001 102 100
001 B002 100 90
001 B003 90 99

001 B004 90 87 (这一条错了,正确值应该是:99 87)

001 B005 87 87
001 B006 87 85
001 B007 85 83
002 B001 234 230
002 B003 230 210
002 B005 210 208
002 B006 208 206
002 B007 206 199
002 B008 199 199
002 B009 199 180

(所影响的行数为 14 行)

samfeng_2003 2006-02-11
  • 打赏
  • 举报
回复
declare @t table
(aaa varchar(20),bbb varchar(20),ccc int,ddd int)

insert @t
select '001','B001',102,100 union all
select '001','B002',0,90 union all
select '001','B003',0,89 union all
select '001','B004',0,87 union all
select '001','B005',0,87 union all
select '001','B006',0,85 union all
select '001','B007',0,83 union all
select '002','B001',234,230 union all
select '002','B003',0,210 union all
select '002','B005',0,208 union all
select '002','B006',0,206 union all
select '002','B007',0,199 union all
select '002','B008',0,199 union all
select '002','B009',0,180 union all
select '003','B001',140,130 union all
select '003','B004',0,109 union all
select '003','B005',0,108 union all
select '003','B008',0,103 union all
select '003','B009',0,98 union all
select '003','B010',0,98 union all
select '003','B017',0,98

update @t set ccc=b.ccc
from @t a,
(
select aaa,bbb,ccc=
isnull((select min(ddd) from @t b where a.aaa=b.aaa and a.bbb>b.bbb),a.ccc),ddd from @t a
) b where a.aaa=b.aaa and a.bbb=b.bbb


select * from @t

aaa bbb ccc ddd
-------------------- -------------------- ----------- -----------
001 B001 102 100
001 B002 100 90
001 B003 90 89
001 B004 89 87
001 B005 87 87
001 B006 87 85
001 B007 85 83
002 B001 234 230
002 B003 230 210
002 B005 210 208
002 B006 208 206
002 B007 206 199
002 B008 199 199
002 B009 199 180
003 B001 140 130
003 B004 130 109
003 B005 109 108
003 B008 108 103
003 B009 103 98
003 B010 98 98
003 B017 98 98

(所影响的行数为 21 行)

34,593

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧