首页 > 解决方案 > 使用 ORDER BY NEWID() 生成随机测试数据,包括重复行

问题描述

我需要从表中为测试数据选择随机行。有时我需要的测试数据行数可能多于表中的记录数。重复没问题。如何构建我的选择以便我可以获得重复的行?

CREATE TABLE [Northwind].[dbo].[Persons]
(PersonID int, LastName varchar(255))

INSERT INTO [Northwind].[dbo].[Persons] 
VALUES
(1, 'Smith'), 
(2, 'Jones'),
(3, 'Washington')

SELECT TOP 5 *
FROM [Northwind].[dbo].[Persons]  
ORDER BY NEWID()

如何让 Select 语句以随机顺序给我五个记录,并重复?目前,它仅以随机顺序返回三个。

我希望能够扩展它以获得 100 行或 1000 行,或者我需要的任何数量。

标签: sqlsql-servertsql

解决方案


使用递归 CTE 合并足够多的行,使它们比您想要的大。然后像以前一样从中选择。

declare
    @desired int = 5,
    @actual int = (select count(*) from persons);

with

    persons as (

        select    personId,
                  lastName,
                  batch = 0
        from      Persons

        union all
        select    personId,
                  lastName,
                  batch = batch + 1
        from      persons
        where     (batch + 1) * @actual < @desired

    )

    select    
    top (@desired) personId, lastName
    from           persons
    order by       newid()

推荐阅读