我尝试使用查询从表员工中选择一个随机数据:rand()但它可能会发生
SELECT email FROM employees
ORDER BY RAND()
LIMIT 1;
,输出为: ORA-00933:SQL命令未正确结束 00933. 00000 - “SQL命令未正确结束”
有人可以告诉我为什么吗?
答案 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