2014-06-19 66 views
-1

有沒有其他的方法來寫這個查詢?替代查詢

select 
* 
from 
(select 
    countries.country_name, sum(profits.amount_sold) 
from 
    PROFITS 
full outer join 
    CUSTOMERS on PROFITS.CUST_ID = CUSTOMERS.CUST_ID 
full outer join 
    COUNTRIES on CUSTOMERS.COUNTRY_ID = COUNTRIES.COUNTRY_ID 
WHERE 
    COUNTRY_NAME = 'Japan' 
group by 
    countries.country_name) 

在此先感謝

+0

只刪除外部'SELECT * FROM'子句。 –

回答

1

看看當前的查詢,它看起來像外部選擇是不必要的。另外,由於您正在聚合行,您不需要完整的外部連接。如果你想有一個稍微不同的方式來簡化查詢,你應該能夠使用:

select countries.country_name, sum(profits.amount_sold) 
from profits, customers, countries 
where profits.cust_id = customers.cust_id 
and customers.country_id = countries.country_id 
and countries.country_name = 'Japan' 
group by countries.country_name; 

最後,因爲你的查詢過濾器,以單行(COUNTRY_NAME =「日本」),你甚至不如果您確定至少有一行,則需要羣組:

select 'Japan' as country_name, sum(profits.amount_sold) 
from profits, customers, countries 
where profits.cust_id = customers.cust_id 
and customers.country_id = countries.country_id 
and countries.country_name = 'Japan'; 
+0

謝謝你們。歡呼聲 – kashif4u

+1

不,**不要**使用隱式連接語法(逗號分隔的'FROM'子句)。始終明確限定您的連接(並儘可能包含儘可能多的條件),因爲這樣可以使其更容易理解/可讀。另外,當你這樣做時,通過忘記一個條件(大多數RDBMS拋出錯誤的'ON'子句),意外地把它變成一個完整的笛卡兒積很容易。儘管如此,我懷疑這是OP實際上的目標...... –

+0

@ Clockwork-Muse絕對是一個很好的觀點,顯式連接總是會更好,因爲顯式條件既增加了可讀性,也使優化器更好地提高了性能。好的優化器應該使它們等價,但並不是所有的DB系統都有優化器。 – Oli

0

您還沒有提供任何客觀e.g更快,更易於閱讀,易於修改等功能。我會假設你打算加快速度。

首先,您可以將國家的連接更改爲左連接。最後,你可以刪除它所在的巢穴,因爲它似乎也沒有達到我們的目的。

+0

再看一遍 - 「客戶」實際上是「利潤」和「國家」之間的交叉參考表。整個查詢取決於該表。 –