问题
你想从表中随机返回 n 行数据,且每次SQL执行时返回的行都不同。
解决方案
使用 DBMS 提供的返回随机值的内置函数。在 ORDER BY 子句中,使用该内置函数以随机的方式对行进行排序,然后返回指定行数。
DB2
select ename,job
from emp
order by rand() fetch first 5 rows only
Oracle
结合使用(内置包 DBMS_RANDOM 中的)内置函数 VALUE、ORDER BY 子句和内置函数 ROWNUM。
select *
from (select *
from emp
order by dbms_random.value())
where rownum <= 5
PostgreSQL
select ename,job
from emp
order by random() limit 5
MySQL
select ename,job
from emp
order by rand() limit 5
SQL Server
select top 5 ename,job
from emp
order by newid()
扩展
ORDER BY 子句可以根据函数的返回值来调整结果集的排列顺序。这些解决方案都在 ORDER BY 子句中的函数执行后限制返回的行数。即便你使用的不是 Oracle,仔细研究 Oracle 解决方案也会有所帮助,因为它展示了其他解决方案在幕后发生的情况。
在 ORDER BY 子句中,使用函数和使用数值常量导致的排序方式是不同的,明白这一点很重要。在 ORDER BY 子句中指定数值常量时,要求根据 SELECT 子句中相应位置的列进行排序。而在 ORDER BY 子句中指定函数时,要求对每行执行该函数,并根据函数的结果进行排序。
点个赞吧,这对我非常重要!