在日常作业中,有时候可能是一些活动要抽出得奖人或选出抽查的一些名单,就常常会使用到Order BY Newid() 的方式来做随机数选出,但有可能的状况需是要搭配到DISTINCT 来选出,这时候如DISTINCT 与Order By Newid() 同时使用就会遇到错误讯息
「如果已指定SELECT DISTINCT,则ORDER BY 项目必须显示于选取列表中」。以下这个范例,就分享一个最简单的处理办法。这边范例的数据库是使用章立民老师书中的范例中文北风数据库,透过用中文的范例数据库,让大家可以比较亲近一些,来了解这个范例的效果。
如果想在这群DISTINCT 数据中随机数选初10笔,则你有可能会直接联想到使用SELECT DISTINCT 员工编号,送货城市FROM dbo.订货主档Order by newid() 当然因为DISTINCT 内在最筛选数据时,没有newid() 则一定会发生「如果已指定SELECT DISTINCT,则ORDER BY 项目必须显示于选取列表中」。
那有可能就会想说,把newid() 加进去SELECT 里面,这样Order BY 就没问题了,这样使用的话,效果可能你会发现是跟全部SELECT一样的效果。
所以说的那么多,解决的方法是什么呢? 就是把DISTINCT(筛选)与Order By Newid() 随机数排序分成两个查询,在组合在一起,
SELECT TOP 10 * FROM — 仿真一个数据表( SELECT DISTINCT 员工编号,送货城市FROM dbo.订货主档) AS 虚构出来的数据表Order by newid()
就透过先筛选的子查询,在使用newid() 就能过将这样的功能轻松的做出来
SQL Server:
Select TOP N * From TABLE Order By NewID() view plaincopy to clipboardprint? Select TOP N * From TABLE Order By NewID()
Select TOP N * From TABLE Order By NewID() NewID()函数将创建一个 uniqueidentifier 类型的唯一值。上面的语句实现效果是从Table中随机读取N条记录。
Access:
Select TOP N * From TABLE Order By Rnd(ID) view plaincopy to clipboardprint? Select TOP N * From TABLE Order By Rnd(ID)
Select TOP N * From TABLE Order By Rnd(ID) Rnd(ID) 其中的ID是自动编号字段,可以利用其他任何数值来完成,比如用姓名字段(UserName)
Select TOP N * From TABLE Order BY Rnd(Len(UserName)) view plaincopy to clipboardprint? Select TOP N * From TABLE Order BY Rnd(Len(UserName))
Select TOP N * From TABLE Order BY Rnd(Len(UserName))
MySql:
Select * From TABLE Order By Rand() Limit 10 view plaincopy to clipboardprint? Select * From TABLE Order By Rand() Limit 10
Select * From TABLE Order By Rand() Limit 10
postgreSQL:
select * from glxt022 order by random() limit 5 view plaincopy to clipboardprint? select * from glxt022 order by random() limit 5