 |
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%且自己會擦乾淨自己的屁股. |
|
回頂端 |
|
 |
|
|
您 無法 在這個版面發表文章 您 無法 在這個版面回覆文章 您 無法 在這個版面編輯文章 您 無法 在這個版面刪除文章 您 無法 在這個版面進行投票 您 無法 在這個版面附加檔案 您 無法 在這個版面下載檔案
|
|