2012-12-03 55 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语句中的聚合函数。