Я изучаю SQL, используя Oracle 10g. Мне нужен запрос, который возвращает отдел с наибольшим количеством сотрудников, чтобы использовать его в обновленном предложении. Я уже решил это, но я не мог понять, почему этот запрос не будет работать:
select deptno
from (select deptno,
count(*) num
from emp
group by deptno)
where not num < any(select count(deptno)
from emp
group by deptno)
Это озадачивает меня больше, так как согласно документации это должно быть эквивалентно и оптимизировано для следующего:
select deptno
from (select deptno,
count(*) num
from emp
group by deptno )
where not exists( select deptno,
count(*)
from emp
having count(*) > num
group by deptno)
Это работает без ошибок. Следующие также работают:
select deptno
from (select deptno,
count(*) num
from emp
group by deptno)
where num = (select max(alias)
from (select count(deptno) alias
from emp
group by deptno))
select deptno
from emp
group by deptno
having not count(deptno) < any( select count(deptno)
from emp
group by deptno)
Edit. Вероятно, это поможет, если я отправлю возвращаемые значения внутренних выборок.
Первый выбор возвращает:
Dept. Number Employees
30 6
20 5
10 3
Последний возвращается (3,5,6)
Я проверил их индивидуально. Также странно, что если я введу значения вручную, они будут работать как положено и вернут 30 как департамент с большинством сотрудников.
select deptno
from (select deptno,
count(*) num
from emp
group by deptno)
where not num < any(6,5,3)
Я использую Oracle 10g 10.2.0.1.0
Последнее редактирование, вероятно. Все еще не знаю, что происходит, но поведение такое, как будто последний выбор возвращает ноль как-то. Поэтому, даже если я уберу «нет», он все равно ничего не выберет.
Если кому-то интересно, я тоже нашел это полезным:
TSQL - НЕКОТОРЫЕ | ЛЮБЫЕ почему они одинаковые с разными именами?
Прочитайте первый ответ. Вероятно, лучше избегать использования каких-либо / некоторых, всего.