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

請問:從一個表查另一個表的內容,如何做才能取得最高效率?

尚未結案
qalin
一般會員


發表:20
回覆:45
積分:13
註冊:2003-07-18

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-05-25 16:34:34 IP:221.228.xxx.xxx 未訂閱
如以下問題(Access庫中有兩個表'水果倉庫'和'拼盤1'): 水果倉庫:(水果,數量,剩餘)蘋果 50,鳳梨 20,香蕉 30,桔子 50 拼盤1:(水果,數量)蘋果 3,香蕉 2 問倉庫裏能提供多少份拼盤1? 我的辦法: var s:string; n:integer; begin ADODataSet1.Close; ADODataSet1.CommandText:='select * from 拼盤1'; ADODataSet1.Open; ADODataSet2.Close; ADODataSet2.CommandText:='select * from 水果倉庫'; ADODataSet2.Open; ADODataSet1.First; repeat s:=ADODataSet1.Fields[0].Value; n:=ADODataSet1.Fields[1].Value; //------------------------------------ ADODataSet2.First; if ADODataSet2.Locate('水果',s,[]) then begin ADODataSet2.Edit; ADODataSet2.Fields[2].Value:=ADODataSet2.Fields[1].Value div n; end; //------------------------------------ ADODataSet1.Next; if ADODataSet1.Eof then exit; until ADODataSet1.Eof; end; 但我發覺我上面的做法效率很低(假設'拼盤1'有200條記錄,'水果倉庫'有20000條記錄時),請問有沒有效率更高的方法??謝謝!
yixiao
一般會員


發表:14
回覆:13
積分:5
註冊:2004-04-26

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-05-25 21:38:14 IP:220.170.xxx.xxx 未訂閱
我想你可以这样: 无论什么拼盘,总有一种水果构成的拼盘最少。 //var i;j:integer; ADODataSet1.Close; ADODataSet1.CommandText:='select * from 拼盤1'; ADODataSet1.Open; i:=0; while not ADODataSet1.eof do begin ADODataSet2.Close; ADODataSet2.CommandText:='select * from 水果倉庫 where 水果=' ADODataSet1.Fields[1].Value; ADODataSet2.Open; j:=ADODataSet2.Fields[1].Value div ADODataSet1.Fields[1].Value; if i>j then i:=j; ADODataSet1.next; end; //i值就是提供的份数,依据拼盘1的组成来确的数据量
Fishman
尊榮會員


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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-05-26 09:43:20 IP:210.65.xxx.xxx 未訂閱
Hi qalin,    我模擬了一下,你看看是否符合你的需要 Table1(各水果拼盤用量表-BOM)內容如下: Table1(水果倉庫)內容如下: SQL Command:
SELECT  MIN(TRUNC(PLATEFUL)) ALLOW_PLTEFUL
FROM   (SELECT  FRUIT_ID,
                SUM(ONHAND_QTY) ONHAND_QTY,
                SUM(USE_QTY) USE_QTY,
                SUM(ONHAND_QTY) / SUM(USE_QTY) PLATEFUL 
        FROM   (SELECT  FRUIT_ID,
                        0 ONHAND_QTY,
                        USE_QTY
                FROM    TABLE1
                WHERE   NAME = '水果拼盤一'
                UNION ALL
                SELECT  FRUIT_ID,
                        ONHAND_QTY,
                        0 USE_QTY
                FROM    TABLE2)
        GROUP BY
                FRUIT_ID
        HAVING  SUM(USE_QTY) > 0)
執行結果: 運作原理: 以 SQL Command 的方式,取得『水果拼盤一』所需各物料量與庫存量,並依此計算出每物料可提供之盤數,以此盤數取的其最小整數值即為答案 PS: 1.裡面的 SubQuery 理論上用 OutterJoin 來作也行,寫法大致如下
SELECT  MIN(TRUNC(PLATEFUL)) ALLOW_PLTEFUL
FROM   (SELECT  T1.FRUIT_ID,
                NVL(T2.ONHAND_QTY,0) ONHAND_QTY,
                T1.USE_QTY,
                NVL(T2.ONHAND_QTY,0) / T1.USE_QTY PLATEFUL
        FROM    TABLE2  T2,
                TABLE1  T1
        WHERE   T2.FRUIT_ID(+) = T1.FRUIT_ID
        AND     NAME = '水果拼盤一'
        AND     T1.USE_QTY > 0)
2.測試環境 Oracle 8.0.5.0.0 發表人 -
------
Fishman
qalin
一般會員


發表:20
回覆:45
積分:13
註冊:2003-07-18

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-05-26 13:55:53 IP:61.177.xxx.xxx 未訂閱
引言: 我想你可以这样: 无论什么拼盘,总有一种水果构成的拼盘最少。 //var i;j:integer; ...
yixiao老弟的程式经修改已经测试通过,比我的简洁多了,谢谢!
qalin
一般會員


發表:20
回覆:45
積分:13
註冊:2003-07-18

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-05-26 14:03:22 IP:61.177.xxx.xxx 未訂閱
引言: Hi qalin, 我模擬了一下,你看看是否符合你的需要 ....... 發表人 - Fishman 於 2004/05/26 09:58:13
哇,大俠出手不凡,這段程式功能強大,想到我前頭去了,估計更吻合我的需求,我趕緊先測試測試,真的很感謝Fishman的賜教...
qalin
一般會員


發表:20
回覆:45
積分:13
註冊:2003-07-18

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-05-26 16:41:05 IP:61.177.xxx.xxx 未訂閱
引言: Hi qalin, 我模擬了一下,你看看是否符合你的需要 ..... 2.測試環境 Oracle 8.0.5.0.0 發表人 - >< face="Verdana, Arial, Helvetica"> Fishman大虾,我没有Oracle,在Access里没法通过,是否要做相应改动才行??
Fishman
尊榮會員


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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-05-26 17:19:11 IP:210.65.xxx.xxx 未訂閱
Hi qalin,
SELECT  MIN(INT(PLATEFUL)) AS ALLOW_PLATEFUL
FROM   (SELECT  FRUIT_ID,
                SUM(ONHAND_QTY) AS ONHAND_QTY,
                SUM(USE_QTY) AS USE_QTY,
                SUM(ONHAND_QTY) / SUM(USE_QTY) AS PLATEFUL 
        FROM   (SELECT  FRUIT_ID,
                        0 AS ONHAND_QTY,
                        USE_QTY
                FROM    TABLE1
                WHERE   NAME = '水果拼盤一'
                UNION ALL
                SELECT  FRUIT_ID,
                        ONHAND_QTY,
                        0 AS USE_QTY
                FROM    TABLE2)
        GROUP BY
                FRUIT_ID
        HAVING  SUM(USE_QTY) > 0)
測試環境:Access 2000 Delphi 7.0 至於 OutterJoin 的寫法,不好意思,因為平常不用 Access,所以不會 ---------------------------------- 小弟才疏學淺,若有謬誤尚請不吝指教 ----------------------------------
------
Fishman
qalin
一般會員


發表:20
回覆:45
積分:13
註冊:2003-07-18

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-05-26 20:15:00 IP:61.177.xxx.xxx 未訂閱
< >非常感谢 >< >
系統時間:2024-05-18 23:58:24
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!