  | 
				VFP 愛用者社區 本討論區為 Visual Foxpro 愛用者經驗交流的地方, 請多多利用"搜尋"的功能, 先查看看有無前例可循, 如果還有不懂的再發問. 部份主題有附加檔案, 須先註冊成為社區居民才可以下載.   
				 | 
			 
		 
		 
	
		| 上一篇主題 :: 下一篇主題   | 
	 
	
	
		| 發表人 | 
		內容 | 
	 
	
		ckp6250
 
 
  註冊時間: 2004-07-30 文章: 1645
 
  第 31 樓
  | 
		
			
				 發表於: 星期一 九月 09, 2013 9:53 am    文章主題:  | 
				     | 
			 
			
				
  | 
			 
			
				依此例,改成LEFT JOIN 是可行的
 
但,萬一(我是說萬一),某些場合,務必得下 INNER JOIN 不可時,要如何是好? | 
			 
		  | 
	 
	
		| 回頂端 | 
		 | 
	 
	
		  | 
	 
	
		jerryclt
 
 
  註冊時間: 2009-03-10 文章: 334 來自: 佛心來的
  第 32 樓
  | 
		
			
				 發表於: 星期四 九月 12, 2013 8:22 am    文章主題:  | 
				     | 
			 
			
				
  | 
			 
			
				 	  | ckp6250 寫到: | 	 		  依此例,改成LEFT JOIN 是可行的
 
但,萬一(我是說萬一),某些場合,務必得下 INNER JOIN 不可時,要如何是好? | 	  
 
 
老實說,
 
小弟還從沒用過 inner join 子句,
 
都是用 left 或 right join 的方式,
 
如果怕有 .NULL. 產生,
 
可以加入一個判斷式...
 
Select Acc4.invent, Acc13.Date, Acc13.mount; 
 
FROM Acc4 LEFT Join Acc13 ; 
 
ON Acc4.invent = Acc13.invent; 
 
ORDER By Acc4.invent, Acc13.Date ; 
 
WHERE (Mod(Recno(),Ceiling(Reccount()/100))=0 Or Recno()=Reccount()) And progress_bar(Recno()*100/Reccount()) ; 
 
OR (!Deleted() And Between(Acc13.Date,'01/01','12/31') AND !ISNULL(Acc4.invent)); 
 
Into Cursor _tmpf | 
			 
		  | 
	 
	
		| 回頂端 | 
		 | 
	 
	
		  | 
	 
	
		ckp6250
 
 
  註冊時間: 2004-07-30 文章: 1645
 
  第 33 樓
  | 
		
			
				 發表於: 星期四 九月 12, 2013 10:18 am    文章主題:  | 
				     | 
			 
			
				
  | 
			 
			
				inner join , left join , right join 
 
各有其用途,
 
效率應該會有差別
 
 
我經常一道指令,七八個 join 搞在一起,也常三種 join 一起用
 
您的方法當然也沒問題,只是 where 要多下些 ! isnull()
 
 
我的概念是,下 where 時要很謹慎,一要精準,二要精簡,這關係到效率,多一項判斷,就多項負擔
 
不知道這樣的概念對不對? | 
			 
		  | 
	 
	
		| 回頂端 | 
		 | 
	 
	
		  | 
	 
	
		jerryclt
 
 
  註冊時間: 2009-03-10 文章: 334 來自: 佛心來的
  第 34 樓
  | 
		
			
				 發表於: 星期四 九月 12, 2013 11:12 am    文章主題:  | 
				     | 
			 
			
				
  | 
			 
			
				除非有哪位前輩可以提供知識,
 
更精簡 (Mod(Recno(),Ceiling(Reccount()/100))=0 Or Recno()=Reccount()) And progress_bar(Recno()*100/Reccount()) 來達到 inner join 的需求,
 
否則小弟直覺是在SELECT後加一行 progress_bar(100)
 
就可以不管是用 inner / left / right / full 的哪一種,
 
都可以顯示未滿100%的部份,
 
順便可以關閉 progress_bar!
 
把它想像成 WAIT WINDOW / CLEAR WINDOW 一般! | 
			 
		  | 
	 
	
		| 回頂端 | 
		 | 
	 
	
		  | 
	 
	
		ckp6250
 
 
  註冊時間: 2004-07-30 文章: 1645
 
  第 35 樓
  | 
		
			
				 發表於: 星期四 九月 12, 2013 11:57 am    文章主題:  | 
				     | 
			 
			
				
  | 
			 
			
				 	  | jerryclt 寫到: | 	 		  
 
把它想像成 WAIT WINDOW / CLEAR WINDOW 一般! | 	  
 
 
 
這個有點強詞奪理 
 
 
wait window
 
-----
 
一些程式碼
 
-----
 
clear window
 
 
各人造業各人擔,今天要下 clear window ,是因為我們在程式碼之前下了 wait window
 
 
而 progress_bar() 是被 select 給『夾』進去的
 
自己『夾』進去的,當然要自己『夾』出來
 
自己的屁股自己擦 | 
			 
		  | 
	 
	
		| 回頂端 | 
		 | 
	 
	
		  | 
	 
	
		jerryclt
 
 
  註冊時間: 2009-03-10 文章: 334 來自: 佛心來的
  第 36 樓
  | 
		
			
				 發表於: 星期四 九月 12, 2013 1:24 pm    文章主題:  | 
				     | 
			 
			
				
  | 
			 
			
				SELECT 0
 
USE Acc13 ALIAS Acc13
 
GO TOP
 
SELECT 0
 
USE Acc4 ALIAS Acc4
 
GO TOP
 
pub_num=INT(SECONDS())
 
Select Acc4.invent,Acc13.Date,Acc13.mount FROM Acc4 inner Join Acc13 ON Acc4.invent=Acc13.invent;
 
   WHERE ((MOD(RECNO(),CEILING(RECCOUNT()/100))=0 OR RECNO()=RECCOUNT()) AND progress_bar(IIF(RECCOUNT()=0,100,RECNO()*100/RECCOUNT())) AND .F.) OR;
 
         (!DELETED() AND BETWEEN(Acc13.Date,'01/01','12/31'));
 
   ORDER By Acc4.invent,Acc13.Date Into Cursor _tmpf
 
*progress_bar(100)
 
pub_num2=_TALLY
 
=MESSAGEBOX('筆數=['+TRANSFORM(pub_num2)+'], ['+stoc(INT(SECONDS())-pub_num)+'] 秒',64,'操作訊息')
 
SELECT _tmpf
 
USE IN _tmpf
 
 
Select Acc13
 
GO TOP
 
Select Acc4
 
GO TOP
 
pub_num=INT(SECONDS())
 
Select Acc4.invent,Acc13.Date,Acc13.mount FROM Acc4 left Join Acc13 ON Acc4.invent=Acc13.invent;
 
   WHERE ((MOD(RECNO(),CEILING(RECCOUNT()/100))=0 OR RECNO()=RECCOUNT()) AND progress_bar(IIF(RECCOUNT()=0,100,RECNO()*100/RECCOUNT())) AND .F.) OR;
 
         (!DELETED() AND BETWEEN(Acc13.Date,'01/01','12/31') AND !ISNULL(Acc4.invent));
 
   ORDER By Acc4.invent,Acc13.Date Into Cursor _tmpf
 
*progress_bar(100)
 
pub_num2=_TALLY
 
=MESSAGEBOX('筆數=['+TRANSFORM(pub_num2)+'], ['+stoc(INT(SECONDS())-pub_num)+'] 秒',64,'操作訊息')
 
SELECT _tmpf
 
USE IN _tmpf
 
 
你自己比較看看執行速度,
 
因為我的電腦硬體算很強,
 
不管怎麼測都是<=1秒,
 
比較不出一個所以然來...
 
 
上例 inner join 會跑兩段 progress bar,
 
且第二次會停在 94% 的地方;
 
而 left join + !ISNULL() 的方式,
 
完美跑完100%且自己會擦乾淨自己的屁股. | 
			 
		  | 
	 
	
		| 回頂端 | 
		 | 
	 
	
		  | 
	 
	
		 | 
	 
 
  
  	 
	    
  	   | 
 	
您 無法 在這個版面發表文章 您 無法 在這個版面回覆文章 您 無法 在這個版面編輯文章 您 無法 在這個版面刪除文章 您 無法 在這個版面進行投票 您 無法 在這個版面附加檔案 您 無法 在這個版面下載檔案
  | 
   
  
		 |