我有一个DataTable与列studentid
。它有1000条记录。我需要选择30个随机ID并将它们插入到数据库表中。然后,我需要排除这30个ID,再选择30个随机ID,并......等等,直到1000条记录。如何从数据表列中选择几个随机值
而且,在每次迭代中,我将有一个给定数量的ID,因此只应选择许多ID(300不是常数,它可能是30,25,23,24 ...)。
我有一个DataTable与列studentid
。它有1000条记录。我需要选择30个随机ID并将它们插入到数据库表中。然后,我需要排除这30个ID,再选择30个随机ID,并......等等,直到1000条记录。如何从数据表列中选择几个随机值
而且,在每次迭代中,我将有一个给定数量的ID,因此只应选择许多ID(300不是常数,它可能是30,25,23,24 ...)。
这可能让你开始:
--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()
创建与1000个学生ID和shuffle数组的数组。然后,从数组的开始处开始并继续前进。
如果您必须持久存在,您可以将数组的内容写入临时表并按顺序逐步执行。
或者,你可以这样做:
SELECT id FROM table
ORDER BY RAND()
,并将其写入到一个临时表。我不记得SQL语法。 SELECT INTO
?这将把所有的ID以随机顺序放入表格中,然后从一开始就可以一次挑出30个。
但我的表已经被其他一些列排序。 – user3116746
@ user3116746:为什么会这样?您只是将ID选择到临时表中。然后,从临时表中抽取30个ID,并从原始表中选择具有这些ID的记录。 –
在这里可以容忍一些动态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
您的意思是来自C#的DataTable吗? – Anon
匿名 - 是的它在C#.. – user3116746
为什么sql-server标记? – Anon