与sql查询抗争

w8biq8rn  于 2021-06-19  发布在  Mysql
关注(0)|答案(1)|浏览(297)

我对sql还比较陌生,我正在为我的uni数据库课程做作业。请求是在我的数据库中找到为每个部门(工作)赚取最低工资的员工的姓名。employees表包含每个员工的姓名、代码、职务和工资。
这是我到目前为止写的查询,虽然它给了我所有正确的名字,但它抛出了一些不应该有的。我的想法是捕捉每个工作的最低工资(使用子查询,它实际上似乎工作得很好),然后将其与full 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;
s6fujrry

s6fujrry1#

你只是拿工资参加。你也需要参加工作:

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

相关问题