有人请解释下面的查询是如何工作的,这个查询是找到第N个最高薪水。 这会像冒泡一样工作,就像一次取一列外部标签并与内部表格进行比较一样......?请你用例子来解释。
Select distinct(salary)
from emp e
where &n = (
Select count(distinct(salary))
from emp
where e.salary<= salary);
答案 0 :(得分:0)
我们举个例子:http://sqlfiddle.com/#!4/b863c9/9
表格强>
create table salary (salary int);
insert into salary values (100);
insert into salary values (200);
insert into salary values (300);
insert into salary values (400);
insert into salary values (400);
insert into salary values (500);
insert into salary values (600);
insert into salary values (700);
insert into salary values (800);
insert into salary values (900);
第二高
Select distinct(salary)
from salary e
where 2 = (
Select count(distinct(salary))
from salary
where e.salary <= salary);
子查询在做什么?
对于外部查询中的每个不同薪水,子查询将执行。 select distinct(salary) from salary
将以无顺序列出所有不同的薪水。
对于每个工资,子查询将过滤高于外部查询工资的工资的数据。然后它将计算不同的工资。让我们来看看:
当外部查询的工资为100时,子查询会执行如下操作:select count(distinct(salary)) from salary where salary >= 100
,结果为9.这意味着,有9个不同的工资&gt; = 100。
当外部查询的工资为200时,子查询执行select count(distinct(salary)) from salary where salary >= 200
。结果是8。
当查询反复查看下一个工资时,它的薪水将达到800.子查询select count(distinct(salary)) from salary where salary >= 800
将导致2.此时,where
子句满足打印外部查询和工资。
就算法而言,它取决于是否有索引以及是否使用顺序。