在SQL Server中随机选择行*每*列的最佳方法

时间:2010-04-28 16:47:57

标签: sql sql-server tsql

搜索SO会产生许多结果,描述如何从数据库表中选择随机数据。我的要求有点不同,因为我希望以最有效/随机/有趣的方式从随机行中选择单个

为了更好地说明:我有一个大的Customers表,从中我想生成一堆虚拟的客户记录,而不是真正的人。我想只是从Customers表中随机查询,然后将FirstNames与LastNames,Address,City,State等随机配对。

因此,如果这是我的真实客户数据(简化):

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())

谢谢!

3 个答案:

答案 0 :(得分:3)

ORDER BY NEWID()适用于SQL Server 2008中的ROW_NUMBER。不确定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

答案 1 :(得分:1)

您可以一次选择前N个随机行(其中N = 3是列数),然后从第1行第2列,第2行第2列等等。我不确定如何在SQL的最后一步,但如果你愿意用其他语言做最后一步,我相信它会很简单。

此外,通过一次选择N行,您将拥有永远不会从同一行中选择两列的新属性(但如果列数多于行,则可能会出现问题)。

答案 2 :(得分:0)

在我看来,你实际上是在尝试生成随机数据 - 事实上你已经拥有一堆非随机数据实际上只是一个侧面注释。如果我在你的鞋子里,我会考虑通过从字典中选择随机单词来生成随机客户,以用作FName,LName,City等。无论如何,这似乎更容易,更随机。