Вы можете использовать онлайн-аналитические функции обработки (OLAP
), такие как DENSE_RANK()
, чтобы легко получить желаемый результат
SELECT Q.SALARY, Q.DID, Q.ENAME
FROM
(
SELECT E.SALARY, W.DID, E.ENAME,
DENSE_RANK() OVER (PARTITION BY W.DID ORDER BY E.SALARY) AS DR
FROM WORKING W
JOIN DEPARTMENT D
ON D.DID = W.EID
JOIN EMPLOYEE E
ON E.EID = W.EID
) Q
WHERE DR = 1
, в котором явный синтаксис JOIN
, синтаксис с разделением запятыми таблицы считаются устаревшими, используются. Использование (INNER
) JOIN
достаточно для вашего случая, в то время как могут быть случаи, требующие OUTER
(LEFT
- RIGHT
или FULL
) JOIN
с.
В пределах функция analyti c, пункт PARTITION
используется для express criteira GROUPING BY
. Основываясь на возрастающем ORDER
для salary
, мы получим минимальные, которые будут отфильтрованы по результатам, поступающим из функции DENSE_RANK()
со значениями, равными единице.
Используя этот метод вы можете получить всех сотрудников с минимальной заработной платой, даже если в каждом отделе работают несколько человек.
Более того, лучше псевдоним таблиц по имени первого имени (или двум или трем символам, содержащимся в их имена в зависимости от общих символов (для первых букв), чтобы квалифицировать столбцы в запросе, а не использовать целые имена.