2016-01-15 2 views
-1

Может кто-нибудь объяснить, как работает этот ниже запрос, этот запрос должен найти Nth самую высокую зарплату. Будет ли это работать подобно сортировке пузыря, точно так же, как взять один столбец внешней вкладки за один раз и сравнить с внутренней таблицей ..? попросив вас объяснить на примере.Как работает коррелированный подзапрос

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

Вы спрашиваете «концептуально, как это работает»? Или вы спрашиваете: «Как база данных действительно оценивает это»? Если вы спрашиваете последнего, ответ «это зависит». Нам нужно будет увидеть план запроса, который ваша версия Oracle выбрала, учитывая ваше конкретное распределение данных, чтобы рассказать вам. И это может измениться мгновенно. –

+0

Ya, хотел оценить его .. просто итерациями .. в частности, я не мог понять sub-запрос. если таблица emp равна 5000,3000,6000,2000 соответственно, и нам нужна вторая по величине. сначала возьмут 5000 (e.salary) и сравните с зарплатой (5000 3000 000 000 000) и повторит за 3000-6000,2000 ..? –

+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 различных зарплаты> = 100.

Когда внешний запрос зарплата 200, подзапрос выполняет select count(distinct(salary)) from salary where salary >= 200. В результате получится 8.

Поскольку запрос снова и снова возвращается к следующим зарплатам, он будет получать зарплату 800. Подпрограмма select count(distinct(salary)) from salary where salary >= 800 приводит к результату 2. В этот момент условие where выполнено для внешнего запрос и зарплата печатаются.

Что касается алгоритма, это зависит от того, есть ли индекс или нет, и используете ли вы порядок.

+0

Большое спасибо .. –

+0

Если вы найдете этот ответ полезно, пожалуйста или закрытие вашего вопроса, отметив его. Спасибо. – zedfoxus

Смежные вопросы