 |
VFP 愛用者社區 本討論區為 Visual Foxpro 愛用者經驗交流的地方, 請多多利用"搜尋"的功能, 先查看看有無前例可循, 如果還有不懂的再發問. 部份主題有附加檔案, 須先註冊成為社區居民才可以下載.
|
上一篇主題 :: 下一篇主題 |
發表人 |
內容 |
freehotpc
註冊時間: 2005-03-27 文章: 28
第 1 樓
|
發表於: 星期日 十一月 20, 2005 7:47 pm 文章主題: Select ... from ... 问题请教 |
|
|
我有四个表:交易情况(内含客户ID、商品ID、业务员ID三个字段)、客户资料(内含客户ID字段)、商品资料(内含商品ID字段)、业务员资料(内含业务员ID字段),
客户资料、商品资料、业务员资料已根据需要进行选择(此三个表都有较多的记录数),
现需要从交易情况中找出在这三个表中有存在记录的记录集,
请教执行速度较快的语句。谢谢。 |
|
回頂端 |
|
 |
bin1x
註冊時間: 2004-08-27 文章: 462
第 2 樓
|
發表於: 星期一 十一月 21, 2005 10:50 am 文章主題: |
|
|
比較先前的寫法
弄個子查詢,在套個 in 或 exist
聽說現在人比較喜歡 用 join 子句
left outter join , 不過我左右分不清楚啦
速度比較快,是拿這個來比較嗎? |
|
回頂端 |
|
 |
freehotpc
註冊時間: 2005-03-27 文章: 28
第 3 樓
|
發表於: 星期一 十一月 21, 2005 12:18 pm 文章主題: |
|
|
能否用一条Select语句完成这些查询:分别用select...where...从客户资料、商品资料、业务员资料取得子集,再从交易情况中取得在前面三个子集中有相同ID存在的子集? |
|
回頂端 |
|
 |
freehotpc
註冊時間: 2005-03-27 文章: 28
第 4 樓
|
發表於: 星期一 十一月 21, 2005 12:21 pm 文章主題: |
|
|
我原来的做法并没有使用SQL语句,只是用VFP的循环语句,因为现在改为远程C/S结构,如果能用一条Select语句在服务器完成处理后只将最终结果返回,则网络传送会快很多。 |
|
回頂端 |
|
 |
bin1x
註冊時間: 2004-08-27 文章: 462
第 5 樓
|
發表於: 星期一 十一月 21, 2005 5:17 pm 文章主題: |
|
|
也許產生成local 的temp dbf 或是 cursor , 或是實體的 dbf ,cursor (其實好像都差不多,還是要用到磁碟空間)
因為無論如何,也要併成一個dbf 或cursor
用union 速度慢 ,雖然一句就解決了,寫的很漂亮,但不實用
我覺得啦,sql 如果化整為零的運算,比一個丟進去,還有效率,這是我用sql 寫報表的感想
所以產生3個檔,至於 join 和 sub子句的sql , 應該是用join 來的有效率點
再用append 做合併,不曉得會不會來的比較好 |
|
回頂端 |
|
 |
yctsai
註冊時間: 2003-04-11 文章: 180
第 6 樓
|
發表於: 星期一 十一月 21, 2005 8:55 pm 文章主題: |
|
|
t1 交易情捸]X含客ID、商品ID、衰D三爬r段)
t2 客V料(X含客ID字段)
t3 商品V料(X含商品ID字段)
t4 V料(X含衰D字段)
cheche=sqlconnect('連接')
=sqlexec(cheche,="select a.*,isnull(b.客V料,'?') as 客V料,isnull(c.商品V料,'?') as 商品V料,isnull(d.V料,'?') as V料from t1 a,t2 b,t3 c,t4 d where a.id*=b.id and a.id*=c.id and a.id*=d.id,'tmp')
=sqldisconnect(cheche)
&&史上最強百萬筆1秒ok |
|
回頂端 |
|
 |
bin1x
註冊時間: 2004-08-27 文章: 462
第 7 樓
|
發表於: 星期一 十一月 21, 2005 9:18 pm 文章主題: |
|
|
where 條件 t1.key = t2.key 用 3個table 用and 做出的結果
和 集合的作法 然後 聯集起來結果可能不太一樣吧
會少掉一些資料 |
|
回頂端 |
|
 |
yctsai
註冊時間: 2003-04-11 文章: 180
第 8 樓
|
發表於: 星期一 十一月 21, 2005 9:25 pm 文章主題: |
|
|
應該不會少資料,"*="已涵蓋 |
|
回頂端 |
|
 |
freehotpc
註冊時間: 2005-03-27 文章: 28
第 9 樓
|
發表於: 星期二 十一月 22, 2005 12:06 am 文章主題: |
|
|
bin1x 寫到: | 也許產生成local 的temp dbf 或是 cursor , 或是實體的 dbf ,cursor (其實好像都差不多,還是要用到磁碟空間)
因為無論如何,也要併成一個dbf 或cursor
用union 速度慢 ,雖然一句就解決了,寫的很漂亮,但不實用
我覺得啦,sql 如果化整為零的運算,比一個丟進去,還有效率,這是我用sql 寫報表的感想
所以產生3個檔,至於 join 和 sub子句的sql , 應該是用join 來的有效率點
再用append 做合併,不曉得會不會來的比較好 |
这样传送很多数据,不利于远程应用。 |
|
回頂端 |
|
 |
freehotpc
註冊時間: 2005-03-27 文章: 28
第 10 樓
|
發表於: 星期二 十一月 22, 2005 12:16 am 文章主題: |
|
|
yctsai 寫到: | 應該不會少資料,"*="已涵蓋 |
请问老大:*= 是什么?为什么会已涵盖另外三个表的全部记录?
在VFP中执行你的语句出错:缺少操作数,难道*=是其他数据库的语句?
VFP中并没有“*=”这种逻辑比较的运算符号,如果*是通配符的话那么是不可能涵盖表中所有记录的!
我现在的做法是先拿 表A join 表B = 表AB,再:表AB join 表C = 表ABC,再:表ABC join 表D = 表ABCD,一共传送返回三个表和传送过去三个表,一共在网络传送六个表,效率很低。而且表B、表C、表D也是分别从Select ... from ... 所得,完美的话也将这三条语句包含进去。
还有一个想法是将所有条件以文本方式发送到服务器,由服务器端完全处理后再返回“表ABCD”,是不是要用到存储过程?还是需要再写个服务器端的处理程序? |
|
回頂端 |
|
 |
yctsai
註冊時間: 2003-04-11 文章: 180
第 11 樓
|
發表於: 星期二 十一月 22, 2005 12:50 am 文章主題: |
|
|
cheche=sqlconnect('連接')
=sqlexec(cheche,"select a.*,isnull(b.客V料,'?') as 客V料,isnull(c.商品V料,'?') as 商品V料,isnull(d.V料,'?') as V料from t1 a,t2 b,t3 c,t4 d where a.id*=b.id and a.id*=c.id and a.id*=d.id",'tmp')
=sqldisconnect(cheche)
1.*=為SQL語法
2.保證可在vfp運行
3."select a.*,isnull(b.客V料,'?') as 客V料,isnull(c.商品V料,'?') as 商品V料,isnull(d.V料,'?') as V料from t1 a,t2 b,t3 c,t4 d where a.id*=b.id and a.id*=c.id and a.id*=d.id",如果太長,vfp無法辨識,可用字串替換
例如
cheche=sqlconnect('連接')
vvv="select a.*,isnull(b.客V料,'?') as 客V料,isnull(c.商品V料,'?') as 商品V料,isnull(d.V料,'?') as V料"
vvv=vvv+"from t1 a,t2 b,t3 c,t4 d where a.id*=b.id and a.id*=c.id and a.id*=d.id",
=sqlexec(cheche,vvv,'tmp')
=sqldisconnect(cheche) |
|
回頂端 |
|
 |
freehotpc
註冊時間: 2005-03-27 文章: 28
第 12 樓
|
發表於: 星期二 十一月 22, 2005 2:55 am 文章主題: |
|
|
谢谢释疑,我再试试。 |
|
回頂端 |
|
 |
syntech
註冊時間: 2003-05-16 文章: 4249 來自: Taipei,Taiwan
第 13 樓
|
發表於: 星期二 十一月 22, 2005 8:41 am 文章主題: |
|
|
*= 是 OUTER JOIN 的舊寫法,
M$ 建議不要再使用 *= 了 _________________ 如果公司有下列困擾:
1. 找不到便宜,快速,簡易的 生產排程軟體
2. 不知道如何快速排定 採購計劃
3. 成本抓不準,自己算比軟體算有用
4. 想學習系統規劃,想找系統架構的顧問
請聯絡我們,也許我們幫得上忙 |
|
回頂端 |
|
 |
syntech
註冊時間: 2003-05-16 文章: 4249 來自: Taipei,Taiwan
第 14 樓
|
發表於: 星期二 十一月 22, 2005 8:50 am 文章主題: |
|
|
如果你的SQL SERVER 的資源夠多(CPU夠多,速度夠快,內存夠大,硬碟夠快),
你可以考慮用一個超大SQL命令讓SQL server處理資料,
讓client端單純的只接收結果,不作資料的二次處理.
vb,asp 因為client較不能做太複雜的處理,
也多半以thin client的方式,只接收結果.
否則,就是讓SQL SERVER 先做一部分的資料處理,
避免SQL SERVER因為大量運算而沒有回應甚至TIME OUT,
這就變成把成本轉嫁到client端,
必須增加網路傳輸時間,client端運算時間等等.
傳統的vfp使用者因為vfp處理資料的效率高,
會傾向於把部分運算交由前端處理.
這稱之為"運算不滅定律"
這本來就沒有對錯,
也沒什麼好爭論的.
我們所能做的只是考量硬體資源的多寡,分配運算的比重而已. _________________ 如果公司有下列困擾:
1. 找不到便宜,快速,簡易的 生產排程軟體
2. 不知道如何快速排定 採購計劃
3. 成本抓不準,自己算比軟體算有用
4. 想學習系統規劃,想找系統架構的顧問
請聯絡我們,也許我們幫得上忙 |
|
回頂端 |
|
 |
freehotpc
註冊時間: 2005-03-27 文章: 28
第 15 樓
|
發表於: 星期二 十一月 22, 2005 4:48 pm 文章主題: |
|
|
哦 终于有一些明白了 |
|
回頂端 |
|
 |
|
|
您 無法 在這個版面發表文章 您 無法 在這個版面回覆文章 您 無法 在這個版面編輯文章 您 無法 在這個版面刪除文章 您 無法 在這個版面進行投票 您 無法 在這個版面附加檔案 您 無法 在這個版面下載檔案
|
|