Борьба с запросом SQL - PullRequest
0 голосов
/ 17 ноября 2018

Я довольно новичок в 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; 

1 Ответ

0 голосов
/ 17 ноября 2018

Вы только вступаете на заработную плату. Вам также нужно присоединиться к работе:

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