Oracle rand()函数

时间:2014-12-13 07:44:09

标签: sql oracle random

我尝试使用查询从表员工中选择一个随机数据:rand()但它可能会发生

SELECT email FROM employees
ORDER BY RAND()
LIMIT 1;

,输出为: ORA-00933:SQL命令未正确结束 00933. 00000 - “SQL命令未正确结束”

有人可以告诉我为什么吗?

4 个答案:

答案 0 :(得分:7)

要加速对大型表的操作,您可以使用SAMPLE子句从表中随机提取数据样本,然后从该样本中随机选择一个数据:

select email from 
( SELECT email,ROWNUM rn
  FROM employees SAMPLE(5)
  --                    ^
  --      each row has 5% chance of being picked-up
  --      adjust that depending your table size and/or your needs
  ORDER BY dbms_random.value)
where rn = 1;

另一个想法是,您不需要完整的排序只是为了提取一个随机行。例如,您可能想尝试这种替代方法:

with cte as (
    SELECT email, ROWNUM rn
    FROM employees
  ),
  rnd as (
    SELECT TRUNC(DBMS_RANDOM.VALUE(1, (SELECT COUNT(*) FROM CTE))) AS value FROM DUAL
  )

SELECT cte.email FROM cte JOIN rnd
    ON cte.rn = rnd.value;

我不知道Oracle是否能够“正确”优化此类查询。

答案 1 :(得分:3)

Oracle没有LIMIT。你可以试试这个:

select email from 
(SELECT email, row_number() over(order by dbms_random.value) rw FROM employees)
where rw = 1;

答案 2 :(得分:1)

Oracle等效rand()dbms_random.value

limit等效的Oracle可以是带有rownum的子查询,也可以是(在Oracle 12中)fetch first xx row only。因此,其中一个应该有效:

select email
from employees
order by dbms_random.value
fetch first 1 row only;

或:

select email
from (select email
      from employees
      order by dbms_random.value
     ) e
where rownum = 1

答案 3 :(得分:-1)

DbSource