Luc*_*uke 1 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;
Run Code Online (Sandbox Code Playgroud)
这个查询符合我的要求,但我不明白为什么会这样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;
Run Code Online (Sandbox Code Playgroud)
该查询至少在两个方面非常可疑:
不使用 Table3 - 除了验证 t3 中是否存在 t2 中的 id 的记录。你想要吗? Potential pitfall如果每个 t2 记录有多个 T3 记录,您将获得笛卡尔积,即 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
Run Code Online (Sandbox Code Playgroud)
你最终得到输出
t1.column, t2.column, SUM(t1.column*t2.column)
2 3 12
3 3 9
3 4 12
Run Code Online (Sandbox Code Playgroud)
看到 (2,3) 已经合并了总和。
如果我将列添加到选择中,我还必须将列添加到分组依据中。
SELECT 中的列(除了一些 DBMS,如 MySQL)必须是聚合(例如 sum/avg/min/max)或 GROUP BY 子句中的列。 您还可以使用其他表达式,例如标量函数或不直接来自表的常量值。
如果您确实需要表中与聚合相关的更多列,则需要清楚地考虑原因。例如,如果您按第 1 列分组并平均第 2 列,您想用第 3 列做什么 - 它应该来自哪一行?