2014-07-19 34 views
0

我不是最好的SQL,但我尽我所能来解决我的问题。我有一个充满了列(ID(PK,身份),Char,Serv,Random)的表格“just”。现在我想从该表中选择一个随机行并将其插入表“f_WinGet”中。到目前为止,我的所有程序都采取了这一步,但我总是在第二个表中获得重复项。从SQL Server表中选择唯一的随机行,但始终重复

第一个表:84行 二表:需要35随机出84

我已经尝试了很多其他方式,但我总是得到相同的结果。我所有的随机程序绑定到一个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()) 

这将是很好,如果任何人hase一个想法我怎么能解决我的问题。我仍在尝试,但我得到的所有结果总是相同的。

+1

如果您插入相同的记录,这是因为您一直选择相同的记录。 'Top 1'不是一个随机函数,它只是选择结果集中的第1行 – CSharper

+0

你说你只需要一行,但实际上你选择的是[TOP 1 PERCENT](http://msdn.microsoft.com /en-us/library/ms189463.aspx)。另外,如果'dbo.just'表中有很少的行,比不管使用了哪种随机化,在多次查询后仍然会有一些重复结束。 –

+0

到目前为止,我展现了你所说的要点。我尝试每次单击按钮以选择1个随机行并将其传输到第二个表。到目前为止,您可以在datagridview中看到添加过程,因此需要按下按钮35x并始终获得一个随机行,但不一样,谁已经在第二个表中。我不需要从第一个表中的记录,所以我想在第一个表中摆脱选择的行,这样我不能得到相同的行两次,当我取下一个 – user3856495

回答

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

这样确保你试图插入值是不是在决赛桌。

+0

TY帮助,当我尝试这种计算策略,我得到了所有三列错误消息“Meldung 209,埃本16,状态1,Prozedur get_W,Zeile 10不明确的列名‘字符’ – user3856495

+0

该列是2个不同的表,所以你必须指定哪一个 – CSharper

+0

我假设这两个表具有相同的列“Char”,“Serv”和“Random”,因此您需要在列名前添加要选择的表的别名。只是改变选择字符,服务...选择j.char,j.serv,... – bruno

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是一个保留字,所以它应该放在方括号中。我将留下您在查询中使用的名称。