从SQL Server表中选择唯一的随机行,但总是重复的

本文关键字:随机 Server 选择 唯一 SQL | 更新日期: 2023-09-27 18:13:45

我不是最好的sql,但我尽我最大的努力得到我的问题完成。我有一个表"只是",其中填满了列(ID (PK,身份),Char, Serv, Random)。现在我想从这个表中选择一个随机行,并将其插入到表"f_WinGet"中。到目前为止,我所有的程序都很好地采取了这一步,但我总是在第二个表中得到重复项。

第一个表:84行第二张表:从84张表中随机抽取35张

我已经尝试了许多其他的方法,但我总是得到相同的结果。我所有的随机过程都被绑定到c#程序中的按钮上。到目前为止,一切都很好,但我总是有一些重复的行在我的表。

 INSERT INTO f_TWinGet 
     SELECT TOP 1 Percent Char, Serv, Random
          FROM ( select distinct  Char, Serv, Random from dbo.just) as derived1 
               ORDER BY CHECKSUM(NEWID())
这将是很好的,如果有人有一个想法,我可以如何解决我的问题。我一直在努力,但得到的总是一样的结果

从SQL Server表中选择唯一的随机行,但总是重复的

如果您想插入35行,请一次完成:

INSERT INTO f_TWinGet(char, serv, random)
     SELECT TOP 35 Char, Serv, Random
     FROM (select distinct  Char, Serv, Random
           from dbo.just
          ) derived1 
     ORDER BY CHECKSUM(NEWID());

如果你真的想一次做一个,我建议使用not exists:

INSERT INTO f_TWinGet(char, serv, random)
     SELECT TOP 1 Char, Serv, Random
     FROM (select distinct  Char, Serv, Random
           from dbo.just
          ) d
    WHERE not exists (select 1 from f_TWinGet f where t.char = f.char and t.serv = f.serv and t.random = f.random)
     ORDER BY CHECKSUM(NEWID());

注意char是一个保留字,所以它应该用方括号括起来。

对于像您这样小的表,您可以使用如下命令:

INSERT INTO f_TWinGet
SELECT TOP 1 j.Char, j.Serv, j.Random
FROM dbo.just j 
LEFT JOIN f_TWinGet f
ON f.Char = j.Char
AND j.Serv = f.Serv
AND j.Random = f.Random
WHERE f.Char IS NULL
ORDER BY NEWID()

这样可以确保您尝试插入的值不在最终表中。