在日常作业中,有时候可能是一些活动要抽出得奖人或选出抽查的一些名单, 就常常会使用到 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