2014-12-13 55 views
1

我試圖選擇表員工查詢隨機數據:)蘭特(但它可能發生甲骨文rand()函數

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

,輸出是: ORA-00933:SQL命令不能正確地結束 00933. 00000 - 「SQL命令未正確結束」

有人可以告訴我爲什麼?

+0

您可以提供數據庫的架構? – TheDillo 2014-12-13 07:58:06

+0

既不存在一個'LIMIT'在Oracle和一個'蘭特()'函數。請閱讀手冊 – 2014-12-13 08:18:50

+0

謝謝我現在可以隨機選擇數據 – 2014-12-13 16:58:14

回答

3

Oracle沒有限制。你可以試試這個:

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

謝謝我現在可以隨機選擇數據 – 2014-12-13 16:57:05

+0

@alvin如果這可以幫助你,請[投票和/或接受答案](http://stackoverflow.com/幫助/人,答案)。這是主要的方式說「謝謝你」在這裏SO。此外,這將有助於今後對這一問題從網上知道哪個回答已經解決了您的問題的人民。 – 2014-12-13 17:29:35

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是否能夠「正確地」優化此類查詢。

+2

榮譽爲提'sample'。 – 2014-12-13 11:34:52

1

Oracle的rand()等效爲dbms_random.value

Oracle等效的limit是帶有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 
+0

感謝現在我可以隨機選擇數據 – 2014-12-13 16:56:24

-1
SELECT 
(DBMS_RANDOM.VALUE(0, 1)) as RND, 
.... 
.... 
.... 

From (your_table) 

Order by RND 
+0

雖然這可以回答這個問題,你應該添加一些評論這可以解釋爲什麼它的工作原理。 – 2016-07-20 11:21:21