  | 
				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 文章: 4252 來自: Taipei,Taiwan
  第 13 樓
  | 
		
			
				 發表於: 星期二 十一月 22, 2005 8:41 am    文章主題:  | 
				     | 
			 
			
				
  | 
			 
			
				*= 是 OUTER JOIN 的舊寫法,
 
M$ 建議不要再使用 *= 了 _________________ 如果公司有下列困擾:
 
1. 找不到便宜,快速,簡易的 生產排程軟體
 
2. 不知道如何快速排定 採購計劃
 
3. 成本抓不準,自己算比軟體算有用
 
4. 想學習系統規劃,想找系統架構的顧問
 
 
請聯絡我們,也許我們幫得上忙 | 
			 
		  | 
	 
	
		| 回頂端 | 
		 | 
	 
	
		  | 
	 
	
		syntech
 
 
  註冊時間: 2003-05-16 文章: 4252 來自: 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    文章主題:  | 
				     | 
			 
			
				
  | 
			 
			
				| 哦 终于有一些明白了 | 
			 
		  | 
	 
	
		| 回頂端 | 
		 | 
	 
	
		  | 
	 
	
		 | 
	 
 
  
  	 
	    
  	   | 
 	
您 無法 在這個版面發表文章 您 無法 在這個版面回覆文章 您 無法 在這個版面編輯文章 您 無法 在這個版面刪除文章 您 無法 在這個版面進行投票 您 無法 在這個版面附加檔案 您 無法 在這個版面下載檔案
  | 
   
  
		 |