2013-11-15 22 views
1

我正在学习sql连接并想清除一个想法。 据我所知,所有选择列应该在group by子句中出现。 例如,规则将字段放入select子句时加入多个表和查询具有group by子句

select a, b 
from table_one 
group by a,b; 

我要加入两个表,类似这样的东西 -

select table_one.a 
from table_one, table_two 
where table_one.id = table_two.id 
group by table_two.c 

的问题是 - 我应该把table_two.c中选择,因为它是在group by子句?

回答

1

当联接表可以使用JOIN -statements而不是

与您的查询

例子:

SELECT t1.a 
FROM table_one t1 /*(t1 is the alias for the table)*/ 
INNER JOIN table_two t2 ON t1.id = t2.id 
GROUP BY t2.c 

你并不需要把t2.c在你的选择,如果你不明确想要在结果中。既然你只选择t1.a,那就是你要得到的。

关于GROUP BY SO的另一个答案值得一读。 :) https://stackoverflow.com/a/1591976/1025823

2

如果您具有分析功能,则group by子句是neede。简单示例:

select order_date, sum(orders) 
from orders_table 
group by order_date; 

从逻辑上讲,仅在列上进行分组时,它们也在select子句中。否则,您可能会为最终用户提供奇怪的数据。例如:

select order_date, sum(orders) 
from orders 
group by country. order_date; 

这会给你一个单独的行,每个日期和国家,但你只能看到结果中的日期。

因此,简单的规则是:将所有列添加到不使用分析函数(即min(),max(),avg(),count())的语句组中,并且不要使用select语句中并不存在的group by语句。 加入时不会改变。分组完全与连接无关。唯一重要的是,你使用的是哪一列。