加入三个表然后组

时间:2011-02-16 17:42:46

标签: sql database join group-by

我将加入三个表,然后将一列与另一列的值相加。

SELECT t1.column, t2.column, SUM(t1.column * t2.column)
FROM table1 t1 
     INNER JOIN table2 t2 
         ON t1.id = t2.id 
     JOIN table3 t3 
         ON t2.id = t3.id 
GROUP BY t1.column, t2.column;

这个查询做了我想要的,但我不明白为什么GROUP BY有效?

如果我在select中添加列,我还要按列添加列吗?

6 个答案:

答案 0 :(得分:4)

你真的知道你在这做什么吗?

SELECT t1.column, t2.column, SUM(t1.column * t2.column)
FROM table1 t1
INNER JOIN table2 t2 ON t1.id = t2.id
JOIN table3 t3 ON t2.id = t3.id
GROUP BY t1.column, t2.column;

该查询至少有两种方式可疑:

  • 不使用表3 - 除了验证t3中是否存在t2中的id的记录。你想要那个吗? Potential pitfall如果每个t2记录有多个T3记录,则会得到cartesian product,这是SUM列的意外乘法。

  • GROUP BY t1.column,t2.column - 它结合了(t1.column, t2.column)的所有唯一组合,并将t1.column * t2.column的结果相加。这真的是你追求的吗?

对于第2点,请考虑此(来源)数据:

t1.id, t1.column, t2.column, t1.column*t2.column
1      2          3          6
2      2          3          6
3      3          3          9
4      3          4          12

你最终得到了输出

t1.column, t2.column, SUM(t1.column*t2.column)
2          3          12
3          3          9
3          4          12

看到(2,3)结合了总和。

  

如果我在select中添加列,我还必须按列添加列。

SELECT中的列(MySQL之类的某些DBMS除外)必须是聚合(例如sum / avg / min / max)或GROUP BY子句中的列。 您可以使用其他表达式,例如标量函数或不直接来自表格的常量值。

如果您确实需要将表相关中的更多列添加到聚合中,您需要清楚地思考为什么。例如如果你按列1和平均列2进行分组,那么你应该对column3做什么 - 它应该来自哪一行?

答案 1 :(得分:1)

这是因为SUM是一个聚合函数,它是根据每个组的结果计算的。

答案 2 :(得分:1)

首先不要担心JOIN。要了解GROUP BY,请先查看一个非常简单的查询。

SELECT t1.year, t1.person
FROM table t1

这将返回

year | person
2000 | Joe
2000 | Betty
2000 | Marty
2001 | Joe
2002 | Betty

如果你投入聚合函数,你必须为聚合函数未涵盖的所有内容包含GROUP BY

SELECT t1.year, COUNT(t1.person) as counter
FROM table t1
GROUP BY t1.year
year | counter
2000 | 3
2001 | 1
2002 | 1

如果您不包含GROUP BY,则它不起作用,因为数据库确实不知道您希望如何对数据进行分组。

答案 3 :(得分:0)

当GROUP BY有多个参数时,就像你的情况一样,它意味着“首先按定义排序#1,如果有多个定义#1,那么按定义排序#2,如果有多个定义#2”然后将这些组合在一起。“。

答案 4 :(得分:0)

作为聚合函数目标的列不必是GROUP BY子句的一部分。聚合函数是SUM, AVG, MIN, MAX等函数。

答案 5 :(得分:0)

因为Aggregate函数为您提供了一个返回值...

首先它将排序然后使用不同的排序结果集对该集合执行聚合操作。