在having子句中使用MIN函数

8

我想获取工资最低的员工姓名。有没有办法只使用一个查询就可以实现这个功能?我已经提供了我的查询语句,但是它不起作用,因为having子句需要一个条件。有没有办法在having子句中给出一个条件,以检索工资最低的员工姓名?

SELECT first_name,min(salary) as "sal"
FROM Employees
GROUP BY first_name 
having min(salary);
8个回答

7
如何使用 ROWNUM
SELECT *
FROM(SELECT first_name, salary
     FROM Employees
     ORDER BY salary
) WHERE ROWNUM = 1

1
非常感谢。但是我想尝试在一个查询中完成它。 - Sindu_
1
Sindu_,你能看到多少个查询?这仅是一个查询。 - Jeffrey Kemp
@JeffreyKemp 我正在尝试在不使用子查询的情况下完成这个任务。 - Sindu_
1
你对子查询有什么问题吗?它们是 SQL 中最强大的功能之一。 - Jeffrey Kemp
1
那个问题的答案将取决于您使用的Oracle版本。 Oracle 12c支持TOP-N查询:http://www.oracle-base.com/articles/12c/row-limiting-clause-for-top-n-queries-12cr1.php - Jeffrey Kemp
显示剩余2条评论

4
SELECT first_name, salary  as "sal" 
FROM   employees
WHERE  salary =(SELECT MIN(salary) 
                FROM   employees);

2
谢谢。但我正在尝试找到一种在单个查询中完成它的方法。 - Sindu_

3
尝试此解决方案,灵感来自这里:
SELECT e1.first_name, e1.salary AS "sal"
FROM Employees e1
LEFT OUTER JOIN Employees e2
ON (e1.id <> e2.id AND e1.salary > e2.salary)
WHERE e2.id IS NULL;

2

通过单个 SELECT 语句:

SELECT MIN( first_name ) KEEP ( DENSE_RANK FIRST ORDER BY salary ASC, first_name ASC ) AS first_name,
       MIN( salary     ) KEEP ( DENSE_RANK FIRST ORDER BY salary ASC, first_name ASC ) AS salary
FROM   Employees;

SQLFIDDLE

然而,如果有多个人的最低工资相同,则只会返回按字母顺序排列最前面的人的名字。

您可以获取所有的名字,但需要多个SELECT语句:

SELECT first_name, salary
FROM   Employees
WHERE  salary = ( SELECT MIN(salary) FROM Employees ); 

但是拥有多个SELECT语句并不是坏事。

SQLFIDDLE


1
SELECT TOP 1 WITH TIES *
FROM employees
ORDER BY salary ASC

1
这是不正确的;OP正在使用Oracle,TOP不是有效的语法。 - Ben

0
尝试这个实现:
SELECT first_name,min(salary) as "sal"
FROM Employees
GROUP BY first_name 
having min(salary) >0;

0
如果你需要拥有最低工资的员工,为什么不使用“Order By”呢?
SELECT top 1 first_name,min(salary) as LowestSalary
FROM Employees order by Salary asc

谢谢,但我在SQL开发人员中尝试了您的查询。它给出了这个错误:00923. 00000 - “未找到期望的FROM关键字”。 - Sindu_
2
这是不正确的;OP正在使用Oracle,而TOP不是有效的语法。 - Ben

0
如果您想使用一条查询完成此操作,并同时检索所有最低工资的员工(例如:您有一个最低工资为40,000美元,但两个员工的工资完全相同),则可以将表格与自身连接。此解决方案还使用了您在原始问题中包含的“having”子句。
SELECT e.first_name,e.salary AS "sal"
FROM Employees e, Employees e2
GROUP BY first_name 
HAVING MIN(e2.salary)=e.salary;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接