Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 四种方法可以在一个角落里找出第二高的薪水,结果各不相同_Sql - Fatal编程技术网

Sql 四种方法可以在一个角落里找出第二高的薪水,结果各不相同

Sql 四种方法可以在一个角落里找出第二高的薪水,结果各不相同,sql,Sql,我用了4种不同的方法来解决一个角落的案例,以找出第二高工资的问题。我想知道为什么下面的第四个方法不会像其他三个方法一样返回一个非空表,其中包含空行。数据非常简单。它只包含一个条目 下面是复制混乱结果的代码 首先,创建一个名为employee的表,其中只有一个条目和两列:id和salary create table employee ( id int null, salary int null ); insert into employee (id, salary) values (1, 100)

我用了4种不同的方法来解决一个角落的案例,以找出第二高工资的问题。我想知道为什么下面的第四个方法不会像其他三个方法一样返回一个非空表,其中包含空行。数据非常简单。它只包含一个条目

下面是复制混乱结果的代码

首先,创建一个名为
employee
的表,其中只有一个条目和两列:
id
salary

create table employee (
id int null,
salary int null
);
insert into employee (id, salary) values
(1, 100);

使用公共表表达式后跟子查询的方法1的代码:

with cte as (
select *, dense_rank() over (order by salary desc) rank
from employee
)
select max(t.salary) SecondHighestSalary
from (select salary from cte where rank = 2) t
输出是

SecondHighestSalary
-------------------
NULL
SecondHighestSalary
-------------------
NULL

方法2的代码,上面方法1的副本,稍作调整:

select max(t.salary) SecondHighestSalary
from (select *, dense_rank() over (order by salary desc) rank from employee) t
where t.rank = 2
结果是:

SecondHighestSalary
-------------------
NULL

使用公共表表达式的方法3的代码:

with cte as (
select *, dense_rank() over (order by salary desc) rank
from employee
)
select isnull((select distinct salary from cte where rank = 2), null) SecondHighestSalary
输出是

SecondHighestSalary
-------------------
NULL
SecondHighestSalary
-------------------
NULL

现在,我的问题来了:下面的解决方案只是方法3的一个调整,遵循相同的原理,用子查询替换公共表表达式。但是,输出不再返回空行。而是返回一个空表。我想知道背后的原因。我如何修复它,使其返回空行

select isnull(t.salary, null) SecondHighestSalary
from (
select *, dense_rank() over (order by salary desc) rank
from employee
) t
where t.rank = 2
生成的表完全为空;缺少
NULL
单元格,因此返回零行

SecondHighestSalary
-------------------

为什么在这里标记了4个完全不同的RDBMS?在做任何事情之前,请先了解您真正使用的RDBMS,然后修复您的标记。不要滥用标记系统,只标记与问题实际相关的东西。