線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1080
推到 Plurk!
推到 Facebook!

如何任意的取得資料表內的任一筆資料(亂數取得)

答題得分者是:cashxin2002
eric039
中階會員


發表:57
回覆:126
積分:51
註冊:2002-11-30

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-11-05 09:12:06 IP:211.75.xxx.xxx 未訂閱
請問大家: 如果我想要亂數取得資料表內的任一筆資料 有沒有比較好的方法。 最好是直接從資料庫抓一筆資料 我也想過全部抓出來,再用亂數去取出其中一筆資料 可是如果資料很多時,可能會比較不好 請熟悉 SQL 語法的大大幫幫忙。 謝謝!! Eric Lin
------
Eric Lin
cashxin2002
版主


發表:231
回覆:2555
積分:1937
註冊:2003-03-28

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-11-05 09:36:37 IP:202.62.xxx.xxx 未訂閱
您好﹗    試試這樣的方法﹕
Var
  I, J : Integer;
begin
  ADOQuery1.Close;
  ADOQuery1.SQL.Clear;
  ADOQuery1.SQL.Add('Select * From TableName');
  ADOQuery1.Open;
  Randomize;
  I := ADOQuery1.RecordCount;
  J := Random(I) 1;  
  ADOQuery1.Close;
  ADOQuery1.SQL.Clear;
  ADOQuery1.SQL.Add('Select * From TableName Where ');
  ADOQuery1.SQL.Add('鍵值欄位 Not In (Select Top X 鍵值欄位 ');
  ADOQuery1.SQL.Add('From TableName) and 鍵值欄位 In ');
  ADOQuery1.SQL.Add('(Select Top Y 鍵值欄位 From TableName)');
  ADOQuery1.Text := StringReplace(ADOQuery1.Text, 'X',
    IntToStr(J), [rfReplaceAll, rfIgnoreCase]);
  ADOQuery1.Text := StringReplace(ADOQuery1.Text, 'X',
    IntToStr(J 1), [rfReplaceAll, rfIgnoreCase]);
  ADOQuery1.Open;
end;
========================= 我是您的朋友﹐有您真好﹗ =========================
------
忻晟
eric039
中階會員


發表:57
回覆:126
積分:51
註冊:2002-11-30

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-11-05 10:04:39 IP:211.75.xxx.xxx 未訂閱
謝謝 我將前面的 Select * from TableName 改成 Select Count(FieldName) as RecordTotal from tabledname 這樣如果 Table 內的資料很多時應該有比較快一點吧? Eric Lin
------
Eric Lin
Fishman
尊榮會員


發表:120
回覆:1949
積分:2163
註冊:2006-10-28

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-11-05 10:13:51 IP:210.65.xxx.xxx 未訂閱
Hi eric039,    以下有一篇討論,but 是針對 Oracle 的,也許你可以套用此觀念試試 http://blog.itpub.net/post/6/318 此外,你用的是何種資料庫?版本為何? ---------------------------------- 小弟才疏學淺,若有謬誤尚請不吝指教 ----------------------------------
------
Fishman
Kenlin2004
一般會員


發表:20
回覆:33
積分:10
註冊:2004-10-27

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-11-05 23:28:35 IP:61.62.xxx.xxx 未訂閱
試試看    select * from your_table where rownum=(select random (count(*)) from your_table)    
eric039
中階會員


發表:57
回覆:126
積分:51
註冊:2002-11-30

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-11-08 09:27:38 IP:211.75.xxx.xxx 未訂閱
Kenlin2004 大大 關於您的方法 select * from your_table where rownum=(select random (count(*)) from your_table) 我是使用 MS SQL 2000 SQL 2000 並沒有 rownum 這個東東可以使用 而且 SQL 2000 內的 random 是 rand() rand() 回傳值為 0到1的浮點數 所以 rand 的回傳值在這裡還要作處理才可使用 如果MS SQL 有類似的 rownum 可以使用,這樣應該沒有問題 您的資料庫應該不是 MS SQL 或是您有其他的用法吧! 感謝您的回答 Eric Lin
------
Eric Lin
wscken
初階會員


發表:28
回覆:75
積分:45
註冊:2003-08-05

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-12-08 14:51:28 IP:210.243.xxx.xxx 未訂閱
現在回答好像慢了點,如果是使用Sql Server的話,你可以使用 Select Top 1 * from TableName Order By Newid() 來做 之前為了這個曾經寫了Cursor來處理,當時我是要抓3筆,測試的結果有點奇怪, 在10萬筆以前,兩個效率差不多,超過變成Cursor效率比較好,而到了30萬筆時, 又反過來,所以之前的案子我們就用了兩個寫法在兩種不相同的資料表格式中.. 你可以試試看 ^^
系統時間:2024-07-02 23:04:30
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!