2013-10-22 104 views
-1

這是一個面試問題。正如問題所述,面試官基本上要求我從數據庫中獲得10條隨機記錄。如果知道有n條記錄,看起來很容易。但在我的情況。我不能搜索記錄的數量。從表格中選擇10條隨機記錄而不查詢記錄數

什麼是有效的方法來做到這一點?

+1

'select * from TABLE LIMIT 10'? – alfasin

+2

這取決於你想要的隨機程度。大多數RDBMS不保證排序,所以'select * from rownum <11'(或者'select top 10 * from table')將是random-ish。 – Joe

+5

什麼RDBMS?什麼表結構?爲什麼要知道表格中的記錄數量有幫助? –

回答

2
SELECT * FROM table ORDER BY RAND() LIMIT 10 
+0

喜歡這種方法,@AkekeKnowing。但請記住Rand()函數需要播種,以便爲每一行提供不同的結果。 – asantaballa

+0

好吧,我得檢查一下。它會得到隨機的行。但可能每次運行查詢時,如果沒有更改,它可能會得到相同的行。如果需要的話,你可以用它來播種它。 – AwokeKnowing

+0

好吧,我相信mysql會處理這個問題,因爲這是它在手冊中的建議。再次,如果有必要,可以使用時間對它進行播種 – AwokeKnowing

1

這似乎基本上是SQL Server Random Sort的副本,它基本上是How to request a random row in SQL?的副本。

後者有多個RDBMS的引用此帖一個全面的答案:

SQL to Select a random row from a database table

Microsoft SQL Server的一個答案是:

SELECT TOP 10 * FROM表 ORDER BY NEWID( );

這在大型表格上表現不佳。它掃描整個表格,爲每一行生成一個唯一的編號(一個16位的GUID),然後按照該編號排序結果。

通過SQL Server中的RAND()進行簡單排序不會產生隨機記錄列表。 RAND()在語句的開始處被評估一次,所以你可以通過一個常量來有效地排序,而這個常量根本沒有排序。如果沒有ORDER BY,你會得到相同的結果。事實上,在我的SQL Server 2005實例中,查詢計劃和結果與ORDER BY RAND()和ORDER BY RAND()相同。

SQL Server中的RAND()需要一個種子值,因此您可能認爲您可以將不同的表列值傳遞給RAND函數並獲得隨機結果。從某種意義上說,你可以。您可以將一個IDENTITY或其他獨特的列傳遞給RAND函數,並且您不會得到與沒有相同的順序。順序在隨便的觀察者看來是隨機的。但它是可重複的。 SQL Server中的RAND()函數將始終爲相同連接上的相同種子返回相同的值:

「對於一個連接,如果使用指定的種子值調用RAND(),則所有後續調用RAND( )根據播種的RAND()調用產生結果。「

http://technet.microsoft.com/en-us/library/ms177610.aspx

因此,儘管你會得到什麼似乎是隨機的列表,如果你在同一個連接多次執行它,你會得到相同的列表。根據您的要求,這可能會足夠好。

基於我在一張小桌子上進行的有限測試,具有獨特列種子的RAND的估計查詢成本略低。