这段sql语句把我看晕了,大大帮忙解答一下~!

itmingong 2009-07-20 12:02:24
看到了这样一段sql语句,可以实现针对条相同记录只更新一条,
对此update语句的执行过程、顺序、结果都很疑惑,大大帮忙解释一下~!

if not object_id('tb') is null
drop table tb
go
create table tb(col varchar(10))
go
insert tb
select 'a' union all
select 'a' union all
select 'a' union all
select 'b' union all
select 'b'
go

declare @col varchar(10),@newcol varchar(10)
update tb set
col=@newcol,
@newcol=case when col=@col then col
else 'new-'+col
end,
@col=col

select * from tb
...全文
176 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
中国风 2009-07-20
  • 打赏
  • 举报
回复
這樣是采用的物理順序更新

declare @col varchar(10),@newcol varchar(10)
update tb set
col=@newcol,--第一個@newcol為null
@newcol=case when col=@col then col
else 'new-'+col
end,
@col=col--賦值當前值為下一條記錄調用

select * from tb
itmingong 2009-07-20
  • 打赏
  • 举报
回复
update中的3个赋值语句的执行顺序如何?
feixianxxx 2009-07-20
  • 打赏
  • 举报
回复
if not object_id('tb') is null 
drop table tb
go
create table tb(col varchar(10))
go
insert tb
select 'a' union all
select 'a' union all
select 'a' union all
select 'b' union all
select 'b'
go

declare @col varchar(10),@newcol varchar(10)
update tb set
col=@newcol,--这个其实是最后一步
@newcol=case when col=@col then col --执行第一次的时候col<>@col ,所以执行else
else 'new-'+col
end,
@col=col

select * from tb
SQL77 2009-07-20
  • 打赏
  • 举报
回复
declare @col varchar(10),@newcol varchar(10)
update tb set
col=@newcol,
@newcol=case when col=@col then col
else 'new-'+col

end,
@col=col
当值相等的时候更新那条,所以只是更新一条!!!
feixianxxx 2009-07-20
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 itmingong 的回复:]
引用 5 楼 feixianxxx 的回复:
SQL code@newcol=casewhen col=@colthen col--第一步else'new-'+colend,@col=col--第二步,col=@newcol,--这个其实是最后一步


为什么col=@newcol是最后一步呢?当然结果如你所说,但它是排在第一位呀,这是我想不通的地方~!

难道是变量的优先级要高?
[/Quote]
先更新变量 再更新表
itmingong 2009-07-20
  • 打赏
  • 举报
回复
re
我验证得出的结果也是这样
xiequan2 2009-07-20
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 itmingong 的回复:]
引用 5 楼 feixianxxx 的回复:
SQL code@newcol=casewhen col=@colthen col--第一步else'new-'+colend,@col=col--第二步,col=@newcol,--这个其实是最后一步


为什么col=@newcol是最后一步呢?当然结果如你所说,但它是排在第一位呀,这是我想不通的地方~!

难道是变量的优先级要高?
[/Quote]
update同时赋值和更新的时候,先执行赋值语句,再更新,刚刚测试过的;但是赋值语句是按照顺序执行;
爱喝茶的大叔 2009-07-20
  • 打赏
  • 举报
回复
当更新第一条记录时,
1.col指向@newcol
2.计算@newcol时因为@col不等col,所以@newcol="new-a"
3.@col被赋值col,即"a"
4.更新col=@newcol="new-a"

当更新第二条记录时,
1.col指向@newcol
2.计算@newcol时因为@col=col="a",所以@newcol=col="a"
3.@col被赋值col,即"a"
4.更新col=@newcol=col="a"

如有误请指正
itmingong 2009-07-20
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 feixianxxx 的回复:]
SQL code@newcol=casewhen col=@colthen col--第一步else'new-'+colend,@col=col--第二步,col=@newcol,--这个其实是最后一步
[/Quote]

为什么col=@newcol是最后一步呢?当然结果如你所说,但它是排在第一位呀,这是我想不通的地方~!

难道是变量的优先级要高?
itmingong 2009-07-20
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 feixianxxx 的回复:]
SQL code@newcol=casewhen col=@colthen col--第一步else'new-'+colend,@col=col--第二步,col=@newcol,--这个其实是最后一步
[/Quote]

为什么col=@newcol是最后一步呢?当然结果如你所说,但它是排在第一位呀,这是我想不通的地方~!

难道是变量的优先级要高?
itmingong 2009-07-20
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 feixianxxx 的回复:]
SQL code@newcol=casewhen col=@colthen col--第一步else'new-'+colend,@col=col--第二步,col=@newcol,--这个其实是最后一步
[/Quote]

为什么col=@newcol是最后一步呢?当然结果如你所说,但它是排在第一位呀,这是我想不通的地方~!

难道是变量的优先级要高?
drysea 2009-07-20
  • 打赏
  • 举报
回复
1:取前一行的数据作为第二行的初始值
2:先执行参数赋值,再进行表的update
itmingong 2009-07-20
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 feixianxxx 的回复:]
SQL code@newcol=casewhen col=@colthen col--第一步else'new-'+colend,@col=col--第二步,col=@newcol,--这个其实是最后一步
[/Quote]

为什么col=@newcol是最后一步呢?当然结果如你说说,但它是排在第一位呀,这是我想不通的地方~!

难道是变量的优先级要高?
confei 2009-07-20
  • 打赏
  • 举报
回复
支持这个解释
[Quote=引用 4 楼 roy_88 的回复:]
這樣是采用的物理順序更新

declare @col varchar(10),@newcol varchar(10)
update tb set
    col=@newcol,--第一個@newcol為null
    @newcol=case when col=@col then col
            else 'new-'+col
        end,
    @col=col--賦值當前值為下一條記錄調用

select * from tb
[/Quote]
feixianxxx 2009-07-20
  • 打赏
  • 举报
回复

@newcol=case when col=@col then col --第一步
else 'new-'+col
end,
@col=col --第二步
,col=@newcol,--这个其实是最后一步

22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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