我有一个名为department
的表,其中包含以下数据
DNO DNAME SALARY
20 EE 30000
10 DoC 50000
30 ITS 20000
我希望选择具有最高和最低工资的员工,而不使用GROUP
函数或前n个分析或NOT EXISTS
命令。任何帮助将不胜感激。感谢
答案 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)