2014-07-19 33 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是一個保留字,所以它應該放在方括號中。我將留下您在查詢中使用的名稱。