VFP 愛用者社區 首頁 VFP 愛用者社區
本討論區為 Visual Foxpro 愛用者經驗交流的地方, 請多多利用"搜尋"的功能, 先查看看有無前例可循, 如果還有不懂的再發問. 部份主題有附加檔案, 須先註冊成為社區居民才可以下載.
 
 常見問題常見問題   搜尋搜尋   會員列表會員列表   會員群組會員群組   會員註冊會員註冊 
 個人資料個人資料   登入檢查您的私人訊息登入檢查您的私人訊息   登入登入

Select ... from ... 问题请教

 
發表新主題   回覆主題    VFP 愛用者社區 首頁 -> VFP 討論區
上一篇主題 :: 下一篇主題  
發表人 內容
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 , 不過我左右分不清楚啦
速度比較快,是拿這個來比較嗎?
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件 參觀發表人的個人網站 MSN Messenger
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 做合併,不曉得會不會來的比較好
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件 參觀發表人的個人網站 MSN Messenger
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 做出的結果
和 集合的作法 然後 聯集起來結果可能不太一樣吧
會少掉一些資料
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件 參觀發表人的個人網站 MSN Messenger
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. 想學習系統規劃,想找系統架構的顧問

請聯絡我們,也許我們幫得上忙
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件 AIM Address
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. 想學習系統規劃,想找系統架構的顧問

請聯絡我們,也許我們幫得上忙
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件 AIM Address
freehotpc



註冊時間: 2005-03-27
文章: 28


第 15 樓

發表發表於: 星期二 十一月 22, 2005 4:48 pm    文章主題: 引言回覆

哦 终于有一些明白了
回頂端
檢視會員個人資料 發送私人訊息
從之前的文章開始顯示:   
發表新主題   回覆主題    VFP 愛用者社區 首頁 -> VFP 討論區 所有的時間均為 台北時間 (GMT + 8 小時)
1頁(共1頁)

 
前往:  
無法 在這個版面發表文章
無法 在這個版面回覆文章
無法 在這個版面編輯文章
無法 在這個版面刪除文章
無法 在這個版面進行投票
無法 在這個版面附加檔案
無法 在這個版面下載檔案


Powered by phpBB © 2001, 2005 phpBB Group
正體中文語系由 phpbb-tw 維護製作