全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:646
推到 Plurk!
推到 Facebook!

從A資料表查B資料表首字

尚未結案
bookworm
中階會員


發表:63
回覆:161
積分:82
註冊:2002-08-03

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-08-15 17:41:15 IP:211.76.xxx.xxx 未訂閱
各位前輩:     我有兩個資料表: A資料表 編號 字 1    的 2    是 3    不    B資料表 詞碼  詞條  首字字碼 1     我們    2     的確     1    我想做的是,查出B.詞條的首字和A.字的對應,然後再算出B.詞條的首字出現了多少漢字。我的做法是用query1讀A,query2讀B,A先跑迴圈,找後B跑迴圈找出首字:
var i, j: integer;
begin
  adoconnection1.Connected := false;
  adoconnection1.Connected := true;
  adoquery1.SQL.Clear;
  adoquery1.SQL.Text := 'select * from A';
  adoquery1.Active := true;
  for i := 1 to adoquery1.RecordCount do
  begin
    adoquery2.sql.clear;
    adoquery2.SQL.Text := 'select * from B';
    adoquery2.Active := true;
    for j := 1 to adoquery2.RecordCount do
    begin
      if copy(adoquery2.fieldbyname('詞條').AsString, 1, 2) = adoquery1.FieldByName('字').AsString then
      begin
        adoquery2.Edit;
        adoquery2.FieldByName('首字字碼').AsInteger := adoquery1.FieldByName('編號').AsInteger;
      end;
      adoquery2.Next
    end;
    adoquery1.next
  end;
  showmessage('轉好了');
end;
程式沒問題,只是非常非常慢,因為我A的table有5000筆,B的table有6萬筆。不知道有什麼簡易又有效率的寫法?因為我一直覺得我的寫法繞了一大圈,所以來請教各位前輩。謝謝! --- 從問中學 ^^
Mickey
版主


發表:77
回覆:1882
積分:1390
註冊:2002-12-11

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-08-15 23:07:17 IP:218.32.xxx.xxx 未訂閱
bookworm 你好: 我手邊沒有資料庫可試, 試試一個 SQL 是否可達成你要的: Update B set 首字字碼=(select 編號 from A where 字=substring(B.詞條,1,2))
timhuang
尊榮會員


發表:78
回覆:1815
積分:1608
註冊:2002-07-15

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-08-15 23:18:14 IP:61.62.xxx.xxx 未訂閱
Hi, 看起來應該是下達一道指令就可以完成的工作, 如下, 若是 access 資料庫可用 update b inner join a on left(b.詞條, 1) = a.字 set b.首字字碼 = a.編號 若是 MSSQL 資料庫可用 update b set b.首字字碼 = a.編號 from b inner join a on left(b.詞條, 1) = a.字 若是其他資料庫也可以參考上面的方式組出對應的 sql command!!
bookworm
中階會員


發表:63
回覆:161
積分:82
註冊:2002-08-03

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-08-16 22:25:28 IP:211.76.xxx.xxx 未訂閱
謝謝兩位前輩這麼快的回應。我用的是access, 試了一下,還是不行。是不是不能將這段SQL command用adoquery1.sql.text或adoquery1.sql.add直接加入呢? Mickey前輩: (select 編號 from A where 字=substring(B.詞條,1,2))運行出錯了,說是語法錯誤。 timhuang前輩: 會出現left(b.詞條, 1) = a.字 set b.首字字碼 = a.編號 少了運算元。 麻煩前輩再次賜教! 這兩段的SQL讓我受益非常多,尤其是timhuang前輩的,這都是書上很少說的地方,謝謝! --- 從問中學 ^^
Fishman
尊榮會員


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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-08-17 09:08:32 IP:210.65.xxx.xxx 未訂閱
Sorry !! 請容小弟放肆,在此插一下花!    將 Micky 版大之語法修改如下試試:    Update B set 首字字碼=(select 編號 from A where 字=Left(B.詞條,1)) ---------------------------------- 小弟才疏學淺,若有謬誤尚請不吝指教 ----------------------------------
------
Fishman
timhuang
尊榮會員


發表:78
回覆:1815
積分:1608
註冊:2002-07-15

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-08-17 09:42:21 IP:203.95.xxx.xxx 未訂閱
Hi, 弟有實際測試過(在 access 2003 上)是 ok 才 post 上來, 為確認沒有問題, 弟又在 access xp 上測試也 ok, 再用 delphi 配合 ADOConnection 及 ADOQuery 來操作也都 ok, 沒有問題, 不知你使用的 access 的版本為何呢?
bookworm
中階會員


發表:63
回覆:161
積分:82
註冊:2002-08-03

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-08-17 10:59:25 IP:211.76.xxx.xxx 未訂閱
三位前輩: 感謝熱心相助,我用timhuang的程式終於可以了,非常感謝!原因好像是本來用中文的欄位名,不知道是衝碼還是什麼,換成英文的就可以了。這些程式碼都是書上很少教的,讓我這個自學者受益匪淺,再次謝謝! --- 從問中學 ^^
系統時間:2024-07-03 20:16:48
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!