从表中随机返回n条记录。可以修改下面的语句,要求下次执行时产生不同的结果集?

原文地址:http://www.worlduc.com/blog2012.aspx?bid=784358


问题

从表中随机返回n条记录。可以修改下面的语句,要求下次执行时产生不同的结果集。

select ename, job
from emp

解决方案

使用DBMS支持的内置函数来生成随机数值。在ORDEY BY子句中使用该函数,对行进行随机排序,然后,使用前面的问题介绍的技巧,来限制所返回的顺序随机的行的数目。

DB2

使用内置函数RAND搭配使用ORDER BY和FETCH:

select ename,job
from emp
order by rand() fetch first 5 rows only

MySQL

使用内置函数RAND搭配使用LIMIT和ORDER BY:

select ename,job
from emp
order by rand() limit 5

PostgreSQL

使用内置函数RAND搭配使用LIMIT和ORDER BY:

select ename,job
from emp
order by random() limit 5

Oracle

使用DBMS_RANDOM包中的内置函数VALUE,搭配使用ORDER BY和内置函数ROWNUM:

select *
from (
 select ename, job
 from emp
 order by dbms_random.value()
     )
where rownum <= 5

SQL Server

使用内置函数NEWID搭配使用TOP和ORDER BY返回随机结果集:

select top 5 ename,job
from emp
order by newid()

讨论

ORDER BY子句可以接受函数的返回值,并使用它来改变结果集的次序。该解决方案中,在ORDER BY子句中执行函数之后,再查询返回的行数。非Oracle用户会发现看看Oracle解决方案会很有用,可以理解解决方案的原理。

重要的是,不要把在ORDER BY子句中使用函数和使用数值常量混合起来。在ORDER BY子句中指定数值常量时,是要求根据SELECT列表中相应位置的列来排序,当在ORDER BY子句中使用函数时则按照每一行的计算结果来排序。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值