我正在學習使用Oracle 10g的SQL。我需要一個查詢來返回員工最多的部門在更新句子中使用它。我已經解決了,但我無法弄清楚,爲什麼這個查詢將無法工作:爲什麼「ANY」無法正常工作?
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)
編輯。如果我發佈內部選擇的返回值,可能會有所幫助。
的第一選擇回報:
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
最後編輯,大概。仍然不知道發生了什麼,但行爲就好像最後一個select以某種方式返回null。所以,即使我刪除了'不',它仍然不會選擇任何東西。
如果有人有興趣,我也發現這個有用: TSQL - SOME | ANY why are they same with different names? 閱讀第一個答案。最好避免使用任何/某些,全部。
我懷疑他們的意思是'num不是<任何(選擇...)'這顯然是不合法的) – onedaywhen
我不知道我是否得到最後一部分,但編輯更清晰。另外,_some_和_any_應該是同一個運算符,而'num> = any(select ...)'將會返回所有的行,因爲每一行至少等於它自己。 'num> = any(select ...)'對於5,6將是真實的,因爲它們都將大於3. –
是的,你是對的。我在想'全部',寫着'任何' –