Oracle 10g를 사용하여 SQL을 배우고 있습니다. 업데이트 문장에서 가장 많은 직원이 근무하는 부서를 반환하는 쿼리가 필요합니다. 나는 이미 그것을 해결,하지만 난이 쿼리가 작동하지 않습니다 이유를 알아낼 수 :"ANY"가 제대로 작동하지 않는 이유는 무엇입니까?
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 not num < any(select count(deptno)
from emp
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)
편집. 아마 inner select의 반환 값을 게시하면 도움이 될 것입니다.
첫 번째 선택 반환 :
이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)
아마, 오라클 10g에게 10.2.0.1.0
마지막 편집을 사용하고 있습니다. 어떤 일이 일어나고 있는지 아직 알 수는 없지만, 마지막 선택이 어떻게 든 null을 반환하는 것처럼 동작합니다. 따라서 '제거'하지 않아도 여전히 아무것도 선택하지 않습니다.
누군가가 관심이있는 경우에도 다음과 같이 유용하다는 것을 발견했습니다. TSQL - SOME | ANY why are they same with different names? 첫 번째 대답을 읽어보십시오. 모든/some, all을 사용하지 않는 것이 좋습니다.
나는 num>
onedaywhen
나는 마지막 부분을 얻었는지 확실하지 않지만 더 명확하게 편집한다. 또한 _some_과 _any_는 같은 연산자로 간주되고 num> = any (select ...)는 모든 행이 적어도 자신과 동일하기 때문에 모든 행을 반환합니다. 'num> = any (select ...)'는 5,6이 모두 3보다 커지기 때문에 true입니다. –
네, 맞습니다. 나는'ALL'을 생각하고'ANY'를 쓰고 있었다. –