2014-06-19 68 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

再看一遍 - “客户”实际上是“利润”和“国家”之间的交叉参考表。整个查询取决于该表。 –