获取随机前 n 行,其中 n 大于 table 中的行数
get random top n rows where n is greater than quantity of rows in table
我正在编写一个生成随机数据的脚本。我有两个 table,一个存储名字,第二个存储姓氏。
我想得到例如1000 对随机的名字和姓氏。我可以使用以下代码实现它:
with x as (
select top 1000 f.firstName from dbo.firstNames f order by newid()
), xx as (
select x.firstName, row_number() over(order by x.firstName) as nameNo from x
), y as (
select top 1000 s.surName from dbo.surNames s order by newid()
), yy as (
select y.surName, row_number() over(order by y.ulica) as nameNo from y
)
select xx.firstName, yy.surName
from xx inner join yy on (xx.nameNo=yy.nameNo)
...但是如果我的 table 之一包含少于 1000 行怎么办?
我想知道如何从 table 中获取超过 n 行,其中 n 小于 table/view 中的行数,并且您不介意重复结果。
我能想到的唯一方法是使用 temp table 和 while 循环,并用随机行填充它直到有足够的行。但我想知道是否可以用一个 select 来完成?我目前在我的电脑上使用 sql server 2012,但如果我也能 运行 在 sql server 2008 下使用它,我将不胜感激。
您可以在交叉连接后进行随机化:
select top 1000 fn.firstname, sn.surname
from firstnames fn cross join
surnames sn
order by newid();
我是第一个承认这种方法存在性能问题的人,但它在理论上确实有效。如果表格最多只有几百行,性能可能还不错。
如果你想要 1000 个随机对,那么每个 table 中的 32 个就足够了 (32*32=1024):
WITH f1 AS (
SELECT TOP 32 firstName FROM dbo.firstName ORDER BY newid()
), s1 AS
SELECT TOP 32 surName FROM dbo.surName ORDER BY newid()
)
SELECT f1.firstName, s1.surName
FROM f1 CROSS JOIN s1;
如果这不够随机,那么您可以尝试以下操作:
WITH f1 AS (
SELECT TOP 100 firstName FROM dbo.firstName ORDER BY newid()
), s1 AS
SELECT TOP 100 surName FROM dbo.surName ORDER BY newid()
)
SELECT TOP 1000 f1.firstName, s1.surName
FROM f1 CROSS JOIN s1
ORDER BY newid();
以上将获得 10,000 种组合,并随机获得 select 1,000 种组合。
我正在编写一个生成随机数据的脚本。我有两个 table,一个存储名字,第二个存储姓氏。 我想得到例如1000 对随机的名字和姓氏。我可以使用以下代码实现它:
with x as (
select top 1000 f.firstName from dbo.firstNames f order by newid()
), xx as (
select x.firstName, row_number() over(order by x.firstName) as nameNo from x
), y as (
select top 1000 s.surName from dbo.surNames s order by newid()
), yy as (
select y.surName, row_number() over(order by y.ulica) as nameNo from y
)
select xx.firstName, yy.surName
from xx inner join yy on (xx.nameNo=yy.nameNo)
...但是如果我的 table 之一包含少于 1000 行怎么办? 我想知道如何从 table 中获取超过 n 行,其中 n 小于 table/view 中的行数,并且您不介意重复结果。 我能想到的唯一方法是使用 temp table 和 while 循环,并用随机行填充它直到有足够的行。但我想知道是否可以用一个 select 来完成?我目前在我的电脑上使用 sql server 2012,但如果我也能 运行 在 sql server 2008 下使用它,我将不胜感激。
您可以在交叉连接后进行随机化:
select top 1000 fn.firstname, sn.surname
from firstnames fn cross join
surnames sn
order by newid();
我是第一个承认这种方法存在性能问题的人,但它在理论上确实有效。如果表格最多只有几百行,性能可能还不错。
如果你想要 1000 个随机对,那么每个 table 中的 32 个就足够了 (32*32=1024):
WITH f1 AS (
SELECT TOP 32 firstName FROM dbo.firstName ORDER BY newid()
), s1 AS
SELECT TOP 32 surName FROM dbo.surName ORDER BY newid()
)
SELECT f1.firstName, s1.surName
FROM f1 CROSS JOIN s1;
如果这不够随机,那么您可以尝试以下操作:
WITH f1 AS (
SELECT TOP 100 firstName FROM dbo.firstName ORDER BY newid()
), s1 AS
SELECT TOP 100 surName FROM dbo.surName ORDER BY newid()
)
SELECT TOP 1000 f1.firstName, s1.surName
FROM f1 CROSS JOIN s1
ORDER BY newid();
以上将获得 10,000 种组合,并随机获得 select 1,000 种组合。