相关子查询的工作原理

时间:2016-01-15 02:38:54

标签: oracle11g

有人请解释下面的查询是如何工作的,这个查询是找到第N个最高薪水。  这会像冒泡一样工作,就像一次取一列外部标签并与内部表格进行比较一样......?请你用例子来解释。

Select distinct(salary) 
from emp e 
where &n = (
    Select count(distinct(salary)) 
    from emp 
    where e.salary<= salary);

1 个答案:

答案 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子句满足打印外部查询和工资。

就算法而言,它取决于是否有索引以及是否使用顺序。