Sql查询与第1和第2高薪相关

时间:2013-01-29 17:46:10

标签: sql sql-server

有人可以告诉我这个SQL查询是如何评估的:

SELECT e.sal 
FROM employees e 
WHERE 1 >= (
    SELECT count(*) 
    FROM employess s 
    WHERE s.sal>e.sal
)

我知道这个查询会返回第一和第二高的薪水。但我想了解这个查询的工作原理。我想知道它是如何返回第一和第二高的薪水。请详细解释。

3 个答案:

答案 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)

<编辑:编辑:我错过了e和s。所以我的答案是错误的。

该查询应返回所有内容。

(SELECT count(*) FROM employess s WHERE s.sal>e.sal)

因为e.sal永远不会是&gt; 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