select distinct sal
from downtodate1.emp AS e1
where 3 = (
select count(distinct sal)
from downtodate1.emp e2
where e1.sal <= e2.sal
);
Рассмотрим у вас есть таблица вроде этого:
С этой части
select distinct sal
from downtodate1.emp AS e1
вы получите результат
sal
---
3
2
1
0
Это составляет 4 отличных зарплаты.
Теперь подзапрос
select count(distinct sal)
from downtodate1.emp e2
where e1.sal <= e2.sal
выполняется для каждой строки основного запроса. Он вычисляет количество различных значений, которые ниже или равны строке в основном запросе. Таким образом, результатом этого является фактически (но не отображается):
sal | count(distinct sal) where e1.sal <= e2.sal
------------------------------------------------
3 1
3 1
2 2
1 3
1 3
0 4
С отличным от основного запроса вы получите этот результат:
sal | count(distinct sal) where e1.sal <= e2.sal
------------------------------------------------
3 1
2 2
1 3
0 4
и с оговоркой WHERE
3 = (/*subquery*/)
вы будете получить только
sal | count(distinct sal) where e1.sal <= e2.sal
------------------------------------------------
1 3
этот номер. Таким образом, результат 1
.
Надеюсь, теперь это ясно.
Вы фильтруете для r ecords ", где 3 - количество отчетливых окладов, к которым текущая зарплата меньше или равна". То есть, когда есть 3 отличных зарплаты, которые больше или равны текущей записи; помните, что текущая запись сама по себе является одной из этих трех. – eggyal