2013-10-21 58 views
0

我有一組名爲 計劃, GROUP, 產品 CLIENT有條件加入 - 加入1和表2的方式

大多數有聯動即 計劃(不是很好正火或關係)表 - >客戶端clno GROUP to PRODUCT on PRODCD

但是,PLAN和GROUP之間的聯繫非常棘手。一個計劃有2個感興趣的領域GRPNO和PRODCD。

我想要做的是,如果GRPNO!= 0,那麼在GRPNO上加入GROUP。但是,如果GRPNO = 0,那麼我想加入PRODCD上的GROUP。

令人沮喪的是,我想在我的查詢中返回的文件是相同的,我只需要能夠改變連接或兩次加入同一個表。

我能想出最好的是2個查詢,並使用數據集合並它們,或者可能使用聯合。

是否有一個很好的方式來做到這一點在一個選擇?

我應該指出我是通過ODBC訪問Foxpro來做到這一點的。

謝謝!

+0

如果你使用'UNION',你可以在一個查詢中有效地完成它們,這是一個非常有效的解決方案。請注意,如果Foxpro支持它,你也可以嘗試一個條件連接;例如,http://stackoverflow.com/questions/10256848/can-i-use-case-statement-in-a-join-condition。 – dash

+0

我曾經讀過一個聯盟會導致2次通過表 - 從而影響性能。我目前正在關注Group的內部選擇。 –

+0

您可以使用'UNION ALL',因爲您可以確信這些集合不會重疊,因此不需要區分。此外,如果您運行UNION ALL查詢,並且速度很快,那麼這足夠好嗎?通常稍後優化會更好:-) – dash

回答

1

你可以這樣做:

JOIN GROUP AS G ON 
(PL.GRPNO = 0 AND G.PRODCD = PL.PRODCD) OR 
(PL.GRPNO !=0 AND G.GRPNO = PL.GRPNO) 

但是,如果這是比使用UNION ALL更快它讓我感到吃驚。

+0

早期跡象表明...這看起來不錯。 –

+0

它的工作原理。這是狗慢。它用於在3〜4秒內返回,現在運行時間將近一分鐘。我看着聯盟,但我不能讓它與TOP玩球,並順序...... –

+0

將UNION包裹在子查詢中。並且請注意orderby也會對性能產生影響。 – Taemyr