不使用SQL中的聚合函数的最高/最低值

时间:2012-03-04 11:01:12

标签: mysql sql database postgresql

我有一个名为department的表,其中包含以下数据

DNO DNAME   SALARY
20  EE  30000
10  DoC 50000
30  ITS 20000

我希望选择具有最高和最低工资的员工,而不使用GROUP函数或前n个分析或NOT EXISTS命令。任何帮助将不胜感激。感谢

3 个答案:

答案 0 :(得分:8)

最多工资:

SELECT *
FROM department d1
WHERE salary > ALL (SELECT d2.salary
                    FROM department d2
                    WHERE d2.dno <> d1.dno)

最低工资:

SELECT *
FROM department d1
WHERE salary < ALL (SELECT d2.salary
                    FROM department d2
                    WHERE d2.dno <> d1.dno)

两种解决方案都假设薪水不能为空

答案 1 :(得分:3)

如果您不想使用任何更复杂的运算符,则可以使用连接执行此操作。

SELECT *
  FROM SO.dbo.MaxNoAgg mna1
LEFT JOIN SO.dbo.MaxNoAgg mna2 ON (mna2.salary > mna1.salary)
WHERE mna2.mna_id IS NULL;

这基本上会为您提供不存在具有更高薪水的行的行。当然,它仍然为所有行提供最大值(SELECT DISTINCT mna1.salary)。

答案 2 :(得分:0)

set nocount on
declare @table table (
    val int
)

insert @table values (17)
insert @table values (31)
insert @table values (8)
insert @table values (79)
insert @table values (25)
insert @table values (13)

select * from @table

select * from @table t where 1 = (select count(distinct val) from @table where t.val >= val)
select * from @table t where 1 = (select count(distinct val) from @table where t.val <= val)