請問:從一個表查另一個表的內容,如何做才能取得最高效率? |
尚未結案
|
qalin
一般會員 發表:20 回覆:45 積分:13 註冊:2003-07-18 發送簡訊給我 |
如以下問題(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 發送簡訊給我 |
我想你可以这样:
无论什么拼盘,总有一种水果构成的拼盘最少。
//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 發送簡訊給我 |
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 發送簡訊給我 |
|
qalin
一般會員 發表:20 回覆:45 積分:13 註冊:2003-07-18 發送簡訊給我 |
|
qalin
一般會員 發表:20 回覆:45 積分:13 註冊:2003-07-18 發送簡訊給我 |
|
Fishman
尊榮會員 發表:120 回覆:1949 積分:2163 註冊:2006-10-28 發送簡訊給我 |
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 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |