Давайте возьмем пример: 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 различных зарплаты> = 100.
Когда внешний запрос зарплата 200, подзапрос выполняет select count(distinct(salary)) from salary where salary >= 200
. В результате получится 8.
Поскольку запрос снова и снова возвращается к следующим зарплатам, он будет получать зарплату 800. Подпрограмма select count(distinct(salary)) from salary where salary >= 800
приводит к результату 2. В этот момент условие where
выполнено для внешнего запрос и зарплата печатаются.
Что касается алгоритма, это зависит от того, есть ли индекс или нет, и используете ли вы порядок.
Вы спрашиваете «концептуально, как это работает»? Или вы спрашиваете: «Как база данных действительно оценивает это»? Если вы спрашиваете последнего, ответ «это зависит». Нам нужно будет увидеть план запроса, который ваша версия Oracle выбрала, учитывая ваше конкретное распределение данных, чтобы рассказать вам. И это может измениться мгновенно. –
Ya, хотел оценить его .. просто итерациями .. в частности, я не мог понять sub-запрос. если таблица emp равна 5000,3000,6000,2000 соответственно, и нам нужна вторая по величине. сначала возьмут 5000 (e.salary) и сравните с зарплатой (5000 3000 000 000 000) и повторит за 3000-6000,2000 ..? –
Я все еще не уверен, что вы просите. Вы пытаетесь понять логически, как этот запрос дает вам результаты, которые он делает (это очень неэффективный и довольно неуклюжий способ получить ответ, но он действительно работает)? Или вы понимаете, что делает запрос, и вы хотите знать, как база данных выбирает реализацию фактического выполнения запроса? Для последнего вам нужно будет предоставить дополнительную информацию, которую я попросил изначально. –