2012-12-03 81 views
2

我想創建一個查詢,返回一個事物的名稱和國家在另一個表中的最大次數。SQL ORA-00979錯誤拋出

這裏的結構:

ShipModels(mname, type, country, numGuns, gunSize) 
Ships(sname, hasModel, launchYear) 
Battles(bname, year) 
Outcomes(ship, battle, result) 

我已經嘗試了很多不同的東西,但不能讓它開始工作。這是我當前的查詢:

SELECT ship, country 
FROM ShipModels, Ships, Outcomes 
WHERE hasModel = mname AND ship = sname 
GROUP BY ship 
HAVING COUNT(ship) >= 
(SELECT COUNT (ship) FROM Outcomes GROUP BY ship); 

Oracle錯誤:

ERROR at line 1: 
ORA-00979: not a GROUP BY expression 

從我已閱讀,當出現在SELECT語句的聚合函數將引發此錯誤,但是... ... ,沒有。有什麼我失蹤?我怎樣才能使這個工作?

+0

如果你打算使用具有COUNT(船),我相信你需要包括COUNT(船)在你的SELECT – WebChemist

回答

2

你包括在SELECTcountry

SELECT ship, country 

但不是在GROUP BY。更改該行:

GROUP BY ship, country 

當你改正,你會碰到另一個錯誤,因爲子查詢是不標,例如不返回一個值:

(SELECT COUNT (ship) FROM Outcomes GROUP BY ship) 

你大概意思寫:

(SELECT MAX(cnt) 
    FROM 
    (SELECT COUNT(ship) AS cnt FROM Outcomes GROUP BY ship) t 
) 

所以,完整的查詢將或多或少:

SELECT ship, country 
FROM ShipModels, Ships, Outcomes 
WHERE hasModel = mname AND ship = sname 
GROUP BY ship, country 
HAVING COUNT(ship) = 
    (SELECT MAX(cnt) 
     FROM 
     (SELECT COUNT(ship) AS cnt FROM Outcomes GROUP BY ship) t 
    ) ; 

你也可以把它寫更像你的企圖,使用關鍵字ALL

SELECT ship, country 
FROM ShipModels, Ships, Outcomes 
WHERE hasModel = mname AND ship = sname 
GROUP BY ship, country 
HAVING COUNT(ship) >= ALL 
    (SELECT COUNT(ship) AS cnt FROM Outcomes GROUP BY ship) ; 

如果您使用顯式連接的「現代」(SQL-92)語法,這也會很好。相反的:

FROM ShipModels, Ships, Outcomes 
WHERE hasModel = mname AND ship = sname 

這是因爲各種原因更好地寫出:

FROM ShipModels m 
    JOIN Ships s ON s.hasModel = m.mname 
    JOIN Outcomes o ON o.ship = s.sname 
+0

正是我在找什麼!非常感謝你! –

0

問題在於HAVING子句中的計數(發貨)。我認爲這是select語句中的聚合函數。