首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >第一高薪和第二高薪相关的Sql查询

第一高薪和第二高薪相关的Sql查询
EN

Stack Overflow用户
提问于 2013-01-30 01:46:10
回答 3查看 5.1K关注 0票数 2

谁能告诉我这个sql查询是如何计算的:

代码语言:javascript
复制
SELECT e.sal 
FROM employees e 
WHERE 1 >= (
    SELECT count(*) 
    FROM employess s 
    WHERE s.sal>e.sal
)

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

EN

回答 3

Stack Overflow用户

发布于 2013-01-30 01:55:37

子选择

代码语言:javascript
复制
 (SELECT count(*) FROM employess s WHERE s.sal>e.sal)

返回薪资大于您在顶层select中查看的当前员工的员工数。

因此,该查询基本上是给我所有其他员工收入不超过1人的员工

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

代码语言:javascript
复制
select top 2 * from employees order by sal desc

EDIT:这将返回工资最高的前两名员工,正如戈登所指出的那样,这与前两名截然不同的工资值不同,因为人们的工资可能完全相同。如果这是一个问题,那么您必须首先像这样删除重复数据:

代码语言:javascript
复制
select top 2 sal from employees group by sal order by sal desc
票数 4
EN

Stack Overflow用户

发布于 2013-01-30 01:51:31

为了获得你的第一和第二高薪水,我会使用ROW_NUMBER()。这应该会让人们很容易理解工资的排名。或者,如果您需要考虑关系,可以考虑使用RANK()

像这样的东西应该是有效的:

代码语言:javascript
复制
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

祝好运。

票数 1
EN

Stack Overflow用户

发布于 2013-01-30 01:49:24

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

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

代码语言:javascript
复制
(SELECT count(*) FROM employess s WHERE s.sal>e.sal)

由于e.sal永远不会> e.sal (1永远不会> 1),因此计数(*)将始终为0。而SELECT e.sal FROM employees e WHERE 1 >= (0)将永远是一切

如果你想返回前两名的薪水,你可能会尝试这样做:

代码语言:javascript
复制
SELECT TOP 2 * FROM employess AS e ORDER BY e.sal DESC
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14589009

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档