2

有人可以告诉我这个 sql 查询是如何计算的:

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

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

4

3 回答 3

4

子选择

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

返回薪水大于您在顶层查看的当前员工的员工人数select

所以查询基本上说给我所有员工,使其他员工的收入比他们多 1 人或更少

非常直截了当,尽管效率极低。更简单的方法就是这样:

select top 2 * from employees order by sal desc

编辑:这将返回薪水最高的前 2 名员工,正如 Gordon 指出的那样,这与前 2 名不同的薪水值不同,因为人们可能有完全相同的薪水。如果这是一个问题,您必须首先像这样对其进行重复数据删除:

select top 2 sal from employees group by sal order by sal desc
于 2013-01-29T17:55:37.443 回答
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

祝你好运。

于 2013-01-29T17:51:31.050 回答
0

编辑:我错过了 e 和 s。所以我的回答是不正确的。

该查询应该返回所有内容。

(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
于 2013-01-29T17:49:23.690 回答