当前位置:  开发笔记 > 数据库 > 正文

TSQL难题,为什么我的更新不是随机的?

如何解决《TSQL难题,为什么我的更新不是随机的?》经验,为你挑选了1个好方法。

我正在查看postgres问题,并且它要求使用随机值更新表.

我只是注意到它在回答之后就是以postgres为目标,但在回答它时我发现了一个谜.

这是我的问题示例代码:

create table #Buildings([Use] varchar(50), n int)

insert #Buildings
select null,null from sysobjects 

update #Buildings
set [Use] = 
        case (ABS(CAST(CAST(NEWID() AS VARBINARY) AS int)) % 6)
            when 0 then null
            when 1 then 'warehouse'
            when 2 then 'office'
            when 3 then 'market'
            when 4 then 'retail'
            when 5 then 'workshop'
            else 'HOW IS THIS POSSIBLE'
        end,
    n = ABS(CAST(CAST(NEWID() AS VARBINARY) AS int)) % 6

select [Use], count(*) from
#Buildings
group by [Use] 

select n, count(*) from
#Buildings
group by n 

它返回一个非常奇怪的结果集:

Use                                                
-------------------------------------------------- -----------
workshop                                           128
HOW IS THIS POSSIBLE                               633
NULL                                               287
retail                                             140
warehouse                                          258
market                                             177
office                                             209

第二个结果集完全合理:

n           
----------- -----------
0           292
3           300
1           313
4           277
5           311
2           339

两个结果集的数据都在同一个更新语句中生成.

所以我的问题是为什么一个超出0-5范围的数字命中我的案例陈述?这个数字是多少?为什么我直接更新int是正确分配的东西?



1> John Boker..:

我有个主意:

也许值是在每个when语句上计算的,如果它到达第一个,计算一个非0的值,它到第二个,然后计算一个非1的值,然后是下一个,依此类推,如果它它是5的方式,然后计算除了5以外的数字.

这也可以解释为什么存在比其他更多"如何可能"的情况,当当前位置和在该位置产生的随机数匹配时,其他的会增加.

你的意见?

编辑:我也在sql server express 2008中测试过,结果相同.

推荐阅读
拾味湖
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有