2010-04-28 100 views
0

搜索SO會產生很多結果,描述如何從數據庫表中選擇隨機的數據。不過,我的要求有點不同,因爲我希望以儘可能高效/隨機/有趣的方式從整個隨機行中選擇個人在SQL Server中隨機選擇行*每列的最佳方法

爲了更好地說明:我有一個很大的Customers表,並且我希望生成一堆虛構的演示客戶記錄,這些記錄不是真正的人。我想的只是從客戶表中隨機查詢,然後隨機與LastNames,地址,城市,州配對FirstNames等

因此,如果這是我真實的客戶數據(簡化):

FirstName LastName State 
========================== 
Sally  Simpson SD 
Will  Warren WI  
Mike  Malone MN 
Kelly  Kline  KS 

然後我會生成一些記錄看起來像這樣的:

FirstName LastName State 
========================== 
Sally  Warren MN 
Kelly  Malone SD 

等等

我最初的方法有效,但它缺乏的是我希望的風采最終答案將提供。 (我與子查詢的重複性,並且該解決方案需要字段的已知/固定數量,因此是不能重複使用的事實尤其不滿。)

SELECT 
FirstName = (SELECT TOP 1 FirstName FROM Customer ORDER BY newid()), 
LastName= (SELECT TOP 1 LastNameFROM Customer ORDER BY newid()), 
State = (SELECT TOP 1 State FROM Customer ORDER BY newid()) 

謝謝!

+2

如果你說你想從你的表中選擇一個隨機列,對我來說,這似乎是你想要做的查詢,並不知道結果將是一個國家,名字或姓氏。我不知道該怎麼做,但它似乎也不是你想要的。 看來你*做*想要選擇隨機行。你只是想爲每一列不同的隨機行。對不起,除了建議你澄清你的問題之外,我無法幫助你。 – Jordi 2010-04-28 17:00:35

+0

我認爲你們都是對的,因爲我並不是真的想要隨機專欄。這個概念很簡單(正如我的樣本表和樣本結果所示),但措辭使我無法理解。如何「隨機重新排列表中的單個列」?一旦我碰到最好的句子,我會編輯這個問題... – LesterDove 2010-04-28 18:12:44

+0

其實,新編輯的標題看起來很完美 - 謝謝 – LesterDove 2010-04-28 18:20:57

回答

3

ORDER BY NEWID()作品與ROW_NUMBER在SQL Server 2008中不知道有關SQL Server 2005,

這需要產生值加入3次獨立的查詢:這是稍微直覺,因爲你認爲它會始終以第100行以不同的順序,但它不...

;With F AS 
(
    SELECT TOP 100 
    FirstName, ROW_NUMBER() OVER (ORDER BY NEWID()) AS Foo 
    FROM Customer 
), L AS 
(
    SELECT TOP 100 
    LastName, ROW_NUMBER() OVER (ORDER BY NEWID()) AS Foo 
    FROM Customer 
), S AS 
(
    SELECT TOP 100 
    State, ROW_NUMBER() OVER (ORDER BY NEWID()) AS Foo 
    FROM Customer 
) 
SELECT 
    F.FirstName, L.LastName, S.State 
FROM 
    F 
    JOIN L ON F.Foo = L.Foo 
    JOIN S ON F.Foo = S.Foo 
+0

+1非常好的使用NEWID和ROW_NUMBER – Meff 2010-04-29 12:05:18

+0

新東西;謝謝。是的,它在2005年工作 – LesterDove 2010-04-29 13:42:29

1

您可以一次選擇前N個隨機行(其中N = 3是列數),然後從第1行,第2行第2列等列出我不確定的確切方式在SQL中做最後一步,但如果你願意做其他語言的最後一步,我相信它會很簡單。

另外,通過一次選擇N行,您將擁有新的屬性,您永遠不會從同一行中選擇兩列(儘管如果列數多於行數,這可能會造成麻煩)。

+0

+1我更喜歡另外保證沒有真正的名字/姓氏與這種技術配對。 – LesterDove 2010-04-28 18:22:18

0

在我看來,你實際上是試圖生成隨機數據 - 事實上,你已經有一堆是非隨機只是一個附註。如果我在你的鞋子裏,我會考慮通過從字典中選擇隨機詞作爲FName,LName,City等來產生隨機客戶。無論如何,這看起來更容易和更隨機。

+0

謝謝 - 這確實會照顧'randonmess'問題。這是一個樣本報告,所以我不認爲一個名叫Pogostick Zucchini先生的顧客是合適的。我想我想要的是隨機化的客戶數據,以更好的方式。這是我原來的帖子中的一個缺陷,對不起。 – LesterDove 2010-04-28 18:15:34

+0

Gotcha。現在我明白了。 – MJB 2010-04-28 19:45:23

相關問題