【问题标题】:why does group by work with "join" but does not with "subquery"?为什么 group by 与“join”一起使用但不与“subquery”一起使用?
【发布时间】:2022-07-11 21:58:56
【问题描述】:
select d.department_id, d.department_name, sum(e.salary) from employees e, departments d
having e.department_id = d.department_id group by d.department_id;


select sum(SALARY) SUMA_SALARIILOR, department_name
from departments join employees on departments.department_id = employees.department_id
group by department_name;

我尝试打印每个部门的所有工资总和,在第二种情况下,它可以使用“join”但不使用子查询。 你能帮我解释一下吗?

【问题讨论】:

  • 您在任何一个示例中都没有使用子查询,第一个示例只是隐式连接的示例。 departments 和 employees 表中的主键是什么?您应该包含表的架构(对这些表使用 SHOW CREATE TABLE 以获得正确的语句)
  • 您的第一个也使用了连接,尽管它是一个不正确的隐式内部连接。将 having e.department_id = d.department_id 更改为 where e.department_id = d.department_id 并重新运行。还...实际上不要使用该代码,因为隐式内部连接语法在几十年前就已经过时了。您的第二个查询写得更好(尽管除了 5.7 之前的 MySQL 版本之外,几乎所有 RDBMS 都会引发错误,但这是一个单独的主题)。

标签: mysql join group-by subquery oracle-sqldeveloper


【解决方案1】:

第一个示例中没有子查询。 它只是一个带有丢失HAVING 子句的笛卡尔积。

您可以使用 WHERE 子句代替 HAVING,这使它成为连接的另一种变体。

HAVING 子句对GROUP BY 的结果进行操作。 我认为它因此出现在GROUP BY 之后,并且绝对不能使用在执行GROUP BY 之后不存在的表达式,就像你的那样。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-11
    • 2014-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-03
    • 1970-01-01
    相关资源
    最近更新 更多