Oracle rand()函数

alv*_*nto 1 sql oracle random

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

SELECT email FROM employees
ORDER BY RAND()
LIMIT 1;
Run Code Online (Sandbox Code Playgroud)

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

谁能告诉我为什么?

Syl*_*oux 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;
Run Code Online (Sandbox Code Playgroud)

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

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;
Run Code Online (Sandbox Code Playgroud)

我不知道Oracle是否能够"正确"地优化这些查询.

  • 感谢提到`样品`. (2认同)

Gor*_*off 6

甲骨文相当于rand()dbms_random.value

Oracle 等价物limit是带有rownumor的子查询(在 Oracle 12 中)fetch first xx row only。因此,其中之一应该有效:

select email
from employees
order by dbms_random.value
fetch first 1 row only;
Run Code Online (Sandbox Code Playgroud)

或者:

select email
from (select email
      from employees
      order by dbms_random.value
     ) e
where rownum = 1
Run Code Online (Sandbox Code Playgroud)