【问题标题】:Struggling with SQL query与 SQL 查询作斗争
【发布时间】:2019-04-20 13:13:28
【问题描述】:

我对 SQL 还很陌生,我正在为我的 Uni 数据库课程做作业。 请求是在我的数据库中查找每个部门(工作)获得最低工资的员工的姓名。 EMPLOYEES 表包含每位员工的姓名、代码、工作和工资。

这是我迄今为止编写的查询,虽然它给了我所有正确的名字,但它抛出了一些不应该存在的更多内容。我的想法是获取每个工作的最低工资(使用子查询,它实际上似乎工作正常),然后将其与完整的 EMPLOYEES 表连接起来,以获取名称。我做错了什么?

    SELECT E.EMP_NAME
    FROM EMPLOYEES AS E
    INNER JOIN (SELECT MIN(WAGE)AS W
            FROM EMPLOYEES
            GROUP BY JOB)AS EMP
    ON E.WAGE=EMP.W
    ORDER BY E.JOB; 

【问题讨论】:

标签: mysql sql join select min


【解决方案1】:

您只是靠工资加入。你也需要加入这份工作:

SELECT E.EMP_NAME
FROM EMPLOYEES E JOIN
     (SELECT E2.JOB, MIN(E2.WAGE) AS MIN_WAGE
      FROM EMPLOYEES E2
      GROUP BY E2.JOB
     ) w
     ON E.WAGE = W.MIN_WAGE AND E.JOB = W.JOB
ORDER BY E.JOB; 

否则,您将获得与另一项工作的最低要求相匹配的员工——而不是您想要的。

一些注意事项:

  • 您正在学习 SQL,因此您应该为每个表指定一个别名并将其用于所有列引用。
  • 您应该给列赋予意义别名。 W 意义不大。

就我个人而言,我会使用相关子查询来写这个:

select e.*
from employees e
where e.wage = (select min(e2.wage) from employees e2 where e2.job = e.job);

【讨论】:

  • 我没有注意到这一点而感到很愚蠢。另外,非常感谢您的建议,我肯定在努力学习编写更有效的查询。我会尝试回到我已经完成的那些,并尝试使它们与你写的更相似!
猜你喜欢
  • 1970-01-01
  • 2021-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-29
  • 2021-11-25
  • 1970-01-01
相关资源
最近更新 更多