我试图从表员工中选择一个带有查询的随机数据:rand()但它可能会发生
SELECT email FROM employees
ORDER BY RAND()
LIMIT 1;
Run Code Online (Sandbox Code Playgroud)
输出为:ORA-00933:SQL命令未正确结束00933. 00000 - "SQL命令未正确结束"
谁能告诉我为什么?
要加速对大型表的操作,您可以使用该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是否能够"正确"地优化这些查询.
甲骨文相当于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)