4

找出薪水最高的前 2 名员工。

表名是salary,列是name,salary

我们可以使用limit命令来做这个查询

select * from salary order by salary DESC limit 0,2

但是如何在不使用 top 和 limit 的情况下做到这一点?

4

8 回答 8

4

我相信这个面试问题试图引导你使用嵌套选择、公用表表达式或类似的东西。TOP 2是一个简单的答案,显然TOP是为了这个目的而实施的——面试希望你“手动”做。

在理论代码中。在第一个(嵌套)选择中为每一行指定一个行数,然后从行数比您需要的行数多一个的结果中进行选择,在这种情况下为 3。

MySQL - 在选择时获取行号

嵌套选择(伪代码):

select row_count, * from salary order by salary desc

外选:

select * from <nested select> where row_count < 3

很抱歉,这不是 MySQL 代码,但我只知道 SQL Server。

我有一些使用行数的 SQL Server 代码:

declare @Salaries table
(
   id int,
   salary money
)

insert into @salaries (id, salary)
values (1, 1),
(2, 2),
(3, 3),
(4, 4),
(5, 4)  -- A duplicating salary

;WITH Props AS
(
    SELECT *,
        ROW_NUMBER() OVER (ORDER BY salary desc) AS RowNumber
    FROM @Salaries
)
SELECT * FROM Props WHERE RowNumber < 3

这将返回 ID 为 4 和 5 的行。


解决 Sachin Kainth 的答案

我相信这个答案是不正确的。尝试以下 SQL Server 代码:

declare @Salaries table
(
   id int,
   salary money
)

insert into @salaries (id, salary)
values (1, 1),
(2, 2),
(3, 3),
(4, 4),
(5, 4)

select * from @salaries where salary in -- "in" introduces the problem
(
SELECT MAX(E1.Salary)  
FROM @salaries E1, @salaries E2
WHERE E1.Salary < E2.Salary

union

SELECT MAX(Salary)  
FROM @salaries
)

这将返回 ID 为 3、4 和 5 的行。而不仅仅是 4 和 5。这是因为外部 select with 子句where salary in将采用第 3、4 和 5 行,它们的薪水都由嵌套选择返回(返回薪水值 3 和 4)。

于 2012-05-23T14:40:13.620 回答
1

根据 SQL:2008 标准,您可以附加FETCH FIRST 10 ROWS ONLY到查询中。虽然,我从未尝试过这个。所以在你的情况下你会有

SELECT * FROM salary ORDER BY salary DESC FETCH FIRST 2 ROWS ONLY
于 2012-05-23T14:42:38.643 回答
1

这是在MySQL中:

SET @row := 0;
SELECT name, salary FROM
(SELECT name, salary, @row := @row + 1 AS Row FROM salary ORDER BY salary DESC)
  AS derived1
WHERE Row < 3

仍然有一个警告。如果有重复的工资,结果可能会出现偏差。如果结果集大于两行,则结果中不会包含平局,但由于问题是针对两个薪水最高的员工而不是两个薪水最高的员工,所以这是我能做的最好的事情。

或许正确的答案是问“重复工资怎么办?”

如果它绝对必须是单个查询,这就是诀窍:

SELECT name, salary FROM
(SELECT name, salary, @row := @row + 1 AS Row FROM (SELECT @row := 0) AS d1, salary)
  AS d2
WHERE Row < 3
于 2012-05-23T15:37:47.243 回答
0
select * from salary where salary in
(
SELECT MAX(E1.Salary)  
FROM Salary E1, Salary E2
WHERE E1.Salary < E2.Salary

union

SELECT MAX(Salary)  
FROM Salary
)
于 2012-05-23T14:39:31.367 回答
0
+------+
| Sal  |
+------+
| 3500 | 
| 2500 |
| 2500 | 
| 5500 |
| 7500 |
+------+

以下查询将返回第 N 个最大值元素。

select SAL from EMPLOYEE E1 where 
 (N - 1) = (select count(distinct(SAL)) 
            from EMPLOYEE E2 
            where E2.SAL > E1.SAL )
于 2013-09-05T07:37:28.167 回答
0

表结构

CREATE TABLE `emp` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(20) DEFAULT NULL,
  `salary` int(10) DEFAULT NULL
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=latin1

Mysql查询第n个术语n代表第n个项目

SELECT salary 
FROM emp 
WHERE salary = (SELECT DISTINCT(salary) 
                FROM emp AS e1 
                WHERE (n) = (SELECT COUNT(DISTINCT(salary)) 
                             FROM emp AS e2 
                             WHERE e1.salary <= e2.salary))
于 2015-05-05T11:39:28.437 回答
0
SELECT e1.EmployeeID, e1.LastName, COUNT(DISTINCT e2.EmployeeID) AS sals_higher
FROM Employees e1
INNER JOIN Employees e2 ON e1.EmployeeID < e2.EmployeeID
GROUP BY e1.EmployeeID
HAVING sals_higher <= 2
ORDER BY e1.EmployeeID DESC

访问https://www.w3schools.com/sql/trysql.asp?filename=trysql_select_union3 并尝试给定的代码,它会为您提供前 2 个最大 EmployeeID。

于 2017-06-10T00:40:11.173 回答
0

`我认为这可能有效

    select * from salary s1 where 2>=(select count(distinct id) from salary s2
 where s1.salary<=s2.salary) order by salary desc;

这是关联查询。对于外部查询中的每一行,内部查询将运行并通过将外部查询的薪水值与表中的每个薪水进行比较来返回一个计数值。它就像编程语言的嵌套循环

假设我们有两列 id 和薪水的表 Salary

id Salary
1  1200
2  12345
3  123456
4  2535436 

输出将是

id salary
4  2535436
2  123456    
于 2018-03-22T18:39:28.760 回答