2014-04-29 122 views
1

我需要從SQL Server數據庫中的一組行中提取一個隨機行。Microsoft SQL Server隨機行

這是我目前運行查詢:

SELECT TOP 1 * 
FROM 
    (SELECT * FROM Flowers WHERE Color = 'Red') a 
ORDER BY NEWID() 

據我瞭解,這應該取得與紅色花朵的所有。然後從其中一個選擇一朵隨機花。但在我看來,它只是從相當少的條目中選擇,因爲我經常看到相同的幾朵花。

所以,現在我想知道如果我的查詢不工作,以及我認爲它會,沒有人看到它的問題?

+1

那麼,SELECT * FROM Flowers WHERE Color =「Red」'返回多少行? (另外,你應該使用'WHERE Color ='Red'',用單引號) – Lamak

+0

這是一個很好的鏈接,用於選擇sql中的隨機行 - http://www.petefreitag.com/item/466.cfm –

+1

How許多紅色的花在那裏,你多久看一次重複?你必須做一些統計分析來確定結果的隨機性。 – AaronLS

回答

1

你不必使用子查詢,你可以直接使用where子句和newid()命令從表中直接選擇。類似......

SELECT TOP 1 * 
FROM Flowers 
WHERE Color = 'Red' 
ORDER BY NEWID() 
+0

爲什麼這會返回不同於正在使用的行數或不同的結果?,基本上是相同的查詢 – Lamak

+0

它不會返回一個不同的結果行數,但在這裏sql服務器不必返回所有的行,其中color ='Red'僅用於實際返回結果集中的一行。它肯定會有同樣不必要的數據處理。 –

+1

優化器很可能會爲您的和op的查詢使用相同的計劃。像「派生表」這樣微不足道的東西不會混淆優化器 – Lamak

1

ORDER BY NEWID()是已知不隨機化的好。 ORDER BY CHECKSUM(NEWID())您會得到更好的結果。

+2

你能解釋一下''ORDER BY NEWID()'是否已知不能隨機化那麼好?「?這些問題會是什麼? –

+2

任何鏈接來證明這個假設? – Lamak

+1

@Lamak Itzik對某些操作系統提到了[這裏](http://sqlmag.com/t-sql/perils-t-sql-randomization)。無論如何,2008年推出了CRYPT_GEN_RANDOM。 –