首页 > 解决方案 > 与 SQL 查询作斗争

问题描述

我对 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; 

标签: mysqlsqljoinselectmin

解决方案


你只是在工资上加入。您还需要加入该工作:

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);

推荐阅读