2012-03-04 60 views
0

使用集合函数我已经已经以下数据最高/最低值,而无需在SQL

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

我想选择与最大和最小薪水雇员WITHOUT使用GROUP功能或顶部 - 正分析名为department表,或NOT EXISTS命令。任何帮助将不胜感激。谢谢

+0

为什么你想要这个? – 2012-03-04 11:02:30

+0

面试问题,我猜? – 2012-03-04 11:03:27

+0

仅用于研究目的 – user841852 2012-03-04 11:03:29

回答

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) 

两种解决方案都假设工资不能为空

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) 
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)。