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

时间:2014-07-19 19:14:17

标签: c# sql sql-server random rows

我不是最好用sql但我尽力让我的问题完成。我有一张桌子"只是"其中填充了列(ID(PK,Identity),Char,Serv,Random)。现在我想从这个表中选择一个随机行并将其插入表格" f_WinGet"。到目前为止,我的所有程序都采用了这一步,但我总是在第二个表中获得Duplicates。

第一张表: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())

如果有人想要我如何解决我的问题,那就太好了。我还在努力,但我得到的所有结果都是一样的。

2 个答案:

答案 0 :(得分:1)

您要插入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是一个保留字,因此它应该是方括号。我要在你的查询中留下你拥有它们的名字。

答案 1 :(得分:0)

使用与您一样小的桌子,您可以使用以下内容:

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()

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