有人可以告诉我这个SQL查询是如何评估的:
SELECT e.sal
FROM employees e
WHERE 1 >= (
SELECT count(*)
FROM employess s
WHERE s.sal>e.sal
)
我知道这个查询会返回第一和第二高的薪水。但我想了解这个查询的工作原理。我想知道它是如何返回第一和第二高的薪水。请详细解释。
答案 0 :(得分:4)
子选择
(SELECT count(*) FROM employess s WHERE s.sal>e.sal)
返回薪水高于您在顶级select
查看的当前员工的员工数。
所以查询基本上说给我所有员工,其中有一个或更少的其他员工比他们赚得更多
非常直接,虽然非常低效。更简单的方法就是:
select top 2 * from employees order by sal desc
编辑:这将返回薪水最高的前2名员工,正如戈登所说,与前2个不同的薪资值不同,因为人们可能拥有完全相同的薪水。 如果这是一个问题,你必须首先重复删除它:
select top 2 sal from employees group by sal order by sal desc
答案 1 :(得分:1)
要获得第一和第二高薪,我会使用ROW_NUMBER()
。这应该可以很容易地理解薪水的排名。或者,如果您需要考虑关系,请查看使用RANK()
。
这样的事情应该有效:
SELECT sal, Row
FROM (
SELECT sal, ROW_NUMBER() OVER(ORDER BY sal DESC) AS Row
FROM employees e ) t
WHERE Row IN (1,2);
这是SQL Fiddle。
祝你好运。答案 2 :(得分:0)
该查询应返回所有内容。
(SELECT count(*) FROM employess s WHERE s.sal>e.sal)
因为e.sal永远不会是> e.sal(1永远不能> 1),因此,count(*)将始终为0。
而SELECT e.sal FROM employees e WHERE 1 >= (0)
将永远是一切
如果你想返回前2名薪水,你可能想尝试这个:
SELECT TOP 2 * FROM employess AS e ORDER BY e.sal DESC