奇怪的NewId(),高手给解释一下

CSDMN 2004-07-20 01:37:49
原问题:http://community.csdn.net/Expert/topic/3191/3191649.xml?temp=.9414789
主  题: 大批量生成随机数的问题
作  者: jjennyj (d)
等  级:
信 誉 值: 100
所属社区: MS-SQL Server 数据库开发
问题点数: 50
回复次数: 7
发表时间: 2004-07-20 11:47:14

我要根据需求随机产生大批量随机数,长度为25位,不过前5位是产品代码无需随机产生,一次需要产生10,000条,还不可以重复。大家给点思路,

---------------------------------------------------------------
第一反映是:
select distinct top 10000 left(newid(),20)
from sysobjects a,sysobjects b,sysobjects c,sysobjects d

结果只得到58条

改成:
select distinct newid()
from sysobjects a,sysobjects b,sysobjects c,sysobjects d

结果还是58条

改成:
select distinct newid()
from (
select a.*
from sysobjects a,sysobjects b,sysobjects c,sysobjects d
) as x

结果还是58条

没办法了,不用sysobjects吧,改成:
select distinct top 10000 left(newid(),20) from
(
select a+b+c+d as [all]
from
(
select 0 as a
union all
select 1
union all
select 2
union all
select 3
union all
select 4
union all
select 5
union all
select 6
union all
select 7
union all
select 8
union all
select 9
) as a,(
select 0 as b
union all
select 1
union all
select 2
union all
select 3
union all
select 4
union all
select 5
union all
select 6
union all
select 7
union all
select 8
union all
select 9
) as b,(
select 0 as c
union all
select 1
union all
select 2
union all
select 3
union all
select 4
union all
select 5
union all
select 6
union all
select 7
union all
select 8
union all
select 9
) as c,(
select 0 as d
union all
select 1
union all
select 2
union all
select 3
union all
select 4
union all
select 5
union all
select 6
union all
select 7
union all
select 8
union all
select 9
) as d
) as x

你们猜我得到几条结果?

...全文
277 49 打赏 收藏 转发到动态 举报
写回复
用AI写文章
49 条回复
切换为时间正序
请发表友善的回复…
发表回复
CSDMN 2004-07-20
  • 打赏
  • 举报
回复
已明白错误所在,结贴了
CSDMN 2004-07-20
  • 打赏
  • 举报
回复
wzh1215(懒猫):
select distinct x from (
select top 10000 left(newid(),20) as x
from sysobjects a,sysobjects b,sysobjects c,sysobjects d
) as x
也是1000行

主要是distinct 不正确实用引起的
zheninchangjiang 2004-07-20
  • 打赏
  • 举报
回复
和sysobjects的行有关
wzh1215 2004-07-20
  • 打赏
  • 举报
回复
----
select distinct x from (
select distinct top 10000 left(newid(),20) as x
from sysobjects a,sysobjects b,sysobjects c,sysobjects d
) as x
----运行结果10000行。
---楼主试试下面的语句能得到多少行!
select distinct x from (
select top 10000 left(newid(),20) as x
from sysobjects a,sysobjects b,sysobjects c,sysobjects d
) as x
neu724 2004-07-20
  • 打赏
  • 举报
回复
楼主的前三条语句我这都返回416条,最后的一条返回10。难道和机器还有关吗???
CSDMN 2004-07-20
  • 打赏
  • 举报
回复
第一次用select distinct top 10000,
想当然的认为先 top,实际先 distinct,应该是这个问题的所在
老宛 2004-07-20
  • 打赏
  • 举报
回复
是呀,帮助里面说的我理解为必须要包含列才能的到想要的结果

---------------------
“如果使用 DISTINCT 关键字,表达式必须只包含列名。而不能包含算术表达式。”

而distinct left(newid(),20) 没有包含列,所以造成奇怪的结果
CSDMN 2004-07-20
  • 打赏
  • 举报
回复
发现可能正如wanyingsong(豌豆)说的,不是newid的问题,而是distinct的问题

语句7:
select distinct top 10000 a.id
from sysobjects a,sysobjects b,sysobjects c,sysobjects d

结果也是58

先distinct再top了

sunwindyang 2004-07-20
  • 打赏
  • 举报
回复
这个比较有兴趣。支持一下
CSDMN 2004-07-20
  • 打赏
  • 举报
回复
wanyingsong(豌豆) :
我觉得这一段帮助是说明DISTINCT在聚合函数(SUM、AVG 和 COUNT)里的用法


jjennyj 2004-07-20
  • 打赏
  • 举报
回复
我也得到了10000条呀
老宛 2004-07-20
  • 打赏
  • 举报
回复
取前20:

select distinct top 10000 left(newid(),20),a.[id]
from sysobjects a,sysobjects b,sysobjects c,sysobjects d

加上一个列,结果也是正确的
zjcxc 2004-07-20
  • 打赏
  • 举报
回复
我上面说错了,newid()是36位,不是32位
CSDMN 2004-07-20
  • 打赏
  • 举报
回复
语句6:
select distinct x from (
select top 10000 left(newid(),20) as x
from sysobjects a,sysobjects b,sysobjects c,sysobjects d
) as x

10000行
CSDMN 2004-07-20
  • 打赏
  • 举报
回复
语句4:
select distinct x from (
select distinct top 10000 left(newid(),20) as x
from sysobjects a,sysobjects b,sysobjects c,sysobjects d
) as x

58行

语句5:
select distinct x from (
select distinct top 10000 a.id,left(newid(),20) as x
from sysobjects a,sysobjects b,sysobjects c,sysobjects d
) as x

10000行
老宛 2004-07-20
  • 打赏
  • 举报
回复
各位老大们看看我的解释,我觉得应该是这个原因
pbsql 2004-07-20
  • 打赏
  • 举报
回复
select distinct id
from (
select top 10000 left(newid(),20) as id
from sysobjects a,sysobjects b,sysobjects c,sysobjects d
) a

运行N遍都是10000行,SQL没有补丁
老宛 2004-07-20
  • 打赏
  • 举报
回复
接上:

而select distinct top 10000 newid() as id
from sysobjects a,sysobjects b,sysobjects c,sysobjects d
的distinct后面没有列名,如果这样
select distinct top 10000 newid(),a.[id]
from sysobjects a,sysobjects b,sysobjects c,sysobjects d
这样distinct后面就有了列名,结果也就正确了
老宛 2004-07-20
  • 打赏
  • 举报
回复
接上:

而select distinct top 10000 newid() as id
from sysobjects a,sysobjects b,sysobjects c,sysobjects d
的distinct后面没有列名,如果这样
select distinct top 10000 newid(),a.[id]
from sysobjects a,sysobjects b,sysobjects c,sysobjects d
这样distinct后面就有了列名,结果也就正确了
zheninchangjiang 2004-07-20
  • 打赏
  • 举报
回复
是不是newid会偷懒
加载更多回复(29)

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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