2013-12-18 63 views
0

我有一个DataTable与列studentid。它有1000条记录。我需要选择30个随机ID并将它们插入到数据库表中。然后,我需要排除这30个ID,再选择30个随机ID,并......等等,直到1000条记录。如何从数据表列中选择几个随机值

而且,在每次迭代中,我将有一个给定数量的ID,因此只应选择许多ID(300不是常数,它可能是30,25,23,24 ...)。

+0

您的意思是来自C#的DataTable吗? – Anon

+0

匿名 - 是的它在C#.. – user3116746

+0

为什么sql-server标记? – Anon

回答

2

这可能让你开始:

--Create a temporary table 
CREATE TABLE #temp (id INTEGER) 
go 

--Insert 30 randow ids into the #temp table, excluding any ids that were previously picked.  
-- run this line as many times as needed. 
INSERT INTO #temp select top 30 id from [student] where [id] not in (select [id] from #temp) order by newid() 
1

创建与1000个学生ID和shuffle数组的数组。然后,从数组的开始处开始并继续前进。

如果您必须持久存在,您可以将数组的内容写入临时表并按顺序逐步执行。

或者,你可以这样做:

SELECT id FROM table 
ORDER BY RAND() 

,并将其写入到一个临时表。我不记得SQL语法。 SELECT INTO?这将把所有的ID以随机顺序放入表格中,然后从一开始就可以一次挑出30个。

+0

但我的表已经被其他一些列排序。 – user3116746

+0

@ user3116746:为什么会这样?您只是将ID选择到临时表中。然后,从临时表中抽取30个ID,并从原始表中选择具有这些ID的记录。 –

0

在这里可以容忍一些动态SQL的使用。

IF (OBJECT_ID('tempdb.dbo.#t_Student') IS NULL) 
BEGIN 
    CREATE TABLE #t_Student 
    (
     StudentID   INTEGER 
    ); 

    SET NOCOUNT ON; 

    DECLARE @i INTEGER; 
     SET @i = 0; 
    WHILE (@i < 1000) 
    BEGIN 
     INSERT INTO #t_Student (StudentID) 
     VALUES (@i); 
     SET @i = @i + 1; 
    END; 

    SET NOCOUNT OFF; 
END; 

IF (OBJECT_ID('tempdb.dbo.#t_Processed') IS NOT NULL) 
BEGIN 
    DROP TABLE #t_Processed; 
END; 

DECLARE @Random   INTEGER, 
     @LowerBound  INTEGER, 
     @UpperBound  INTEGER, 
     @SQL   NVARCHAR(MAX); 
    SET @LowerBound = 1; 
    SET @UpperBound = 30; 

CREATE TABLE #t_Processed 
(
    StudentID   INTEGER 
); 

WHILE (( SELECT COUNT(1) 
      FROM dbo.#t_Processed) < 
     ( SELECT COUNT(1) 
      FROM dbo.#t_Student)) 
BEGIN 
    SET @Random = ROUND(((@UpperBound - @LowerBound) * RAND() + @LowerBound), 0); 

    SET @SQL = ' 
     SELECT TOP ' + LEFT(@Random, 10) + ' StudentID 
     FROM #t_Student 
     WHERE StudentID NOT IN ( SELECT StudentID 
            FROM #t_Processed)       
     ORDER BY NEWID();'; 
    INSERT INTO #t_Processed (StudentID) 
    EXECUTE dbo.sp_executesql @statement = @SQL; 
END; 
GO