如果查詢中包含一個彙總函式,而所選擇的列並不在彙總函式中,那麼這些列就必須在GROUP BY子句中;否則就會出現下面的錯誤:ORA-00937: not a single-group group function。例如,下面這個查詢選擇product_type_id列和AVG(price),但是卻沒有使用一個包含product_type_id的GROUP BY子句:
SQL> SELECT product_type_id, AVG(price) 2 FROM products; SELECT product_type_id, AVG(price) * ERROR at line 1: ORA-00937: not a single-group group function |
之所以會出現這個錯誤是因為資料庫不知道怎樣在結果集中處理product_type_id列。考慮一下:這個查詢既試圖使用AVG彙總函式對多行記錄進行操作,卻又試圖從每行中獲得product_type_id列的值;這兩個操作是不可能同時完成的。此時必須提供一個GROUP BY子句告訴資料庫將product_type_id列相同的行分組在一起,然後資料庫就可以將這些組中的行傳遞給AVG函數。
警告:
如果查詢中包含彙總函式,而所選擇的列並不在彙總函式中,那麼這些列就必須在GROUP BY子句中。
還有,不能在WHERE子句中使用彙總函式來限制行。如果這樣做,就會出現下面的錯誤:ORA-00934: group function is not allowed here。例如:
SQL> SELECT product_type_id, AVG(price) 2 FROM products 3 WHERE AVG(price) > 20 4 GROUP BY product_type_id; WHERE AVG(price) > 20 * ERROR at line 3: ORA-00934: group function is not allowed here |
之所以會出現這個錯誤是因為WHERE子句只能用來對單行而不是行組進行過濾。要過濾行組,可以使用HAVING子句。