日期:2014-05-17  浏览次数:20458 次

有点疑惑
select id,newid() from dizigui where id = 342 
union
select top 3 id,newid() from dizigui where id != 341 and id != 342 order by newid()

执行这条语句时
除342这条记录
剩余的3条总是表的前3条记录
只是顺序不同而已

select top 3 id,newid() from dizigui where id != 341 and id != 342 order by newid()

单独执行这条语句
总是能随机的抽取3条记录

---为什么呢

我的目的是想除342这叫记录之外,另外3条记录是随机取出来的
------最佳解决方案--------------------
试试这个
select id,newid() from dizigui where id = 342  
union
select top 3 id,newid() from dizigui where id != 341 and id != 342 order by checksum(newid())

------其他解决方案--------------------
select Pid from Product where pid=20
union
 select PID from (select top 3 PID,NEWID() as a from Product order by checksum(newid()))A



------其他解决方案--------------------
按楼主的方式,我运行出结果正常啊。
------其他解决方案--------------------
引用:
试试这个


SQL code?



123

select id,newid() from dizigui where id = 342   unionselect top 3 id,newid() from dizigui where id != 341 and id != 342 order by checksum(newid())


提示 “'unionselect' 附近有语法错误”
我的是sql 2000
------其他解决方案--------------------
'unionselect' 这个错误不关我那个事,是csdn编辑界面的错。你把语句调整过来试试,不过我没2000,不知道有没有checksum函数
------其他解决方案--------------------
引用:
'unionselect' 这个错误不关我那个事,是csdn编辑界面的错。你把语句调整过来试试,不过我没2000,不知道有没有checksum函数

sql 2000 中有这个函数
但是提示 “如果语句中包含 UNION 运算符,那么 ORDER BY 子句中的项就必须出现在选择列表中。”
换成这样
select id,checksum(newid()) from dizigui where id = 342 
union 
select top 3 id,checksum(newid()) from dizigui where id != 341 and id != 342 order by checksum(newid())

查询结果和原来一样
------其他解决方案--------------------
下面是我在2008的AdventureWorks库上做的测试,并且我也找了写资料,CHECKSUM(NEWID())可以实现随机抽取数据。语法是2008才有,2000会报错的,但是证明了是可以的。你多试几次看看,不过如果你的表里面就只有那么几条数据。那就没用了

 SELECT TOP 10 * FROM HumanResources.Department WHERE DepartmentID NOT IN (8,10) ORDER BY CHECKSUM(NEWID())
 GO 5
 
 /*
 开始执行循环
 DepartmentID Name                                               GroupName                                          Modi