2014-09-22 98 views
-1

我想計數的結果賦值給一個變量,這樣我就可以在隨後的查詢中使用它,這裏是我的代碼:爲什麼在這個查詢中有無效的標識符?

select distinct(Artist), count(distinct(Instrument)) as allins 
from performers 
where allins = (select count(distinct(x.Instrument)) 
       from performers x) 
group by Artist; 

錯誤:ORA-00904: "ALLINS": invalid identifier

+3

[在WHERE子句中使用別名]可能的重複(http://stackoverflow.com/questions/356675/using-an-alias-in-a-where-clause) – 2014-09-22 00:07:35

回答

2

這是您的查詢:

select distinct(Artist), count(distinct(Instrument)) as allins 
from performers 
where allins = (select count(distinct(x.Instrument)) from performers x) 
group by Artist; 

淘氣,調皮。您不能使用在where子句中的select中定義的列別名。您也不能在where子句中使用聚合函數,所以代碼沒有意義。你想要的是一個having條款:

select Artist, count(distinct(Instrument)) as allins 
from performers 
group by Artist 
having count(distinct Instrument) = (select count(distinct x.Instrument) from performers x) 

注意:你幾乎不必select distinct當你有一個聚集查詢。而且,distinct不是一個函數,所以括號是不必要的。

0

SQL的執行與Java或C絕對不一樣,所以經常會讓新程序員進入語言。

更多的,往往不是數據庫的理解SQL指令的順序是這樣的:

FROM - > WHERE - > GROUP BY - > - >選擇

爲了正確地做到這一點你不能在SELECT子句中聲明某些東西是別名,並且期望它能夠工作,因爲程序很可能從FROM子句開始。

另外,根據我的經驗,在SELECT子句中引用對方時,列別名不能很好地工作。

我相當不幸的解決方案就是不使用別名並輸入整個事情。

另外,您絕對肯定地不應該在WHERE子句中使用聚合函數。它必須始終處於HAVING子句中。如果您不希望Oracle投訴要求藝術家,您還需要使用GROUP BY子句。此外,由於您正在按藝術家進行分組,而其他功能是聚合,因此您無需使用DISTINCT。