搜索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())
谢谢!
答案 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等。无论如何,这似乎更容易,更随机。