【问题标题】:Using the MIN function in the having clause在have子句中使用MIN函数
【发布时间】:2013-11-14 17:12:29
【问题描述】:

我想获取最低工资的员工的姓名。有没有办法只使用一个查询来做到这一点?我在下面给出了我的查询,它不起作用,因为 having 子句需要一个条件。有没有办法在有条款中给出一个条件,以检索具有最低工资的员工姓名?

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

【问题讨论】:

    标签: sql oracle min having


    【解决方案1】:

    ROWNUM怎么样?

    SELECT *
    FROM(SELECT first_name, salary
         FROM Employees
         ORDER BY salary
    ) WHERE ROWNUM = 1
    

    【讨论】:

    • 非常感谢。但我试图在一个查询中做到这一点
    • Sindu_,你能看到多少个查询?这只是一个查询。
    • @JeffreyKemp 我试图在不使用子查询的情况下做到这一点
    • 子查询有什么问题?它们是 SQL 最强大的功能之一。
    • 该问题的答案取决于您使用的 Oracle 版本。 Oracle 12c 支持 TOP-N 查询:oracle-base.com/articles/12c/…
    【解决方案2】:
    SELECT first_name, salary  as "sal" 
    FROM   employees
    WHERE  salary =(SELECT MIN(salary) 
                    FROM   employees);
    

    【讨论】:

    • 谢谢。但我试图找到一种在单个查询中完成此操作的方法。
    【解决方案3】:

    试试这个解决方案,灵感来自here

    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;
    

    【讨论】:

      【解决方案4】:

      使用单个 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

      【讨论】:

        【解决方案5】:
        SELECT TOP 1 WITH TIES *
        FROM employees
        ORDER BY salary ASC
        

        【讨论】:

        • 这是不正确的; OP 正在使用 Oracle,而 TOP 语法无效。
        【解决方案6】:

        如果您需要最低工资的员工,为什么不使用 Order By ..

        SELECT top 1 first_name,min(salary) as LowestSalary
        FROM Employees order by Salary asc
        

        【讨论】:

        • 谢谢,但我在 SQL 开发人员中尝试了您的查询。它给出了这个错误:00923. 00000 - “FROM 关键字未在预期的地方找到”
        • 这是不正确的; OP 正在使用 Oracle,而 TOP 语法无效。
        【解决方案7】:

        SELECT first_name,min(salary) as "sal" 来自员工 按名字分组 min(salary) >0;

        【讨论】:

          猜你喜欢
          • 2019-04-17
          • 1970-01-01
          • 2016-10-19
          • 2012-09-18
          • 1970-01-01
          • 2012-03-25
          • 2018-01-15
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多