返回一个每个部门工资最高的员工。
使用DISTINCT ON 进行更简单、更快速的查询,满足您的所有要求:
SELECT DISTINCT ON (d.id)
d.id AS department_id, d.name AS department
,e.id AS employee_id, e.name AS employee, e.salary
FROM departments d
LEFT JOIN employees e ON e.department_id = d.id
ORDER BY d.id, e.salary DESC;
->SQLfiddle(用于 Postgres)。
另请注意LEFT [OUTER] JOIN,它会在结果中保留没有员工的部门。
这仅选择每个部门的 one 员工。如果有多个共享最高薪水,您可以添加更多 ORDER BY 项目以特别选择一个。否则,会从同行中任意挑选一个。
如果没有员工,仍会列出部门,其中员工列的值为 NULL。
您可以简单地在SELECT 列表中添加您需要的任何列。
在此相关答案中找到该技术的详细说明、链接和基准:
Select first row in each GROUP BY group?
除此之外:使用非描述性列名(如 name 或 id)是一种反模式。应该是employee_id、employee等。
返回所有个每个部门薪水最高的员工。
使用窗口函数rank()(类似@Scotch already posted,只是更简单更快):
SELECT d.name AS department, e.employee, e.salary
FROM departments d
LEFT JOIN (
SELECT name AS employee, salary, department_id
,rank() OVER (PARTITION BY department_id ORDER BY salary DESC) AS rnk
FROM employees e
) e ON e.department_id = d.department_id AND e.rnk = 1;
与您的示例(没有关联)的上述查询结果相同,只是慢了一点。