2

別のテーブルにあるものの名​​前と国を最も多く返すクエリを作成しようとしています。

構造は次のとおりです。

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ステートメントに集計関数がある場合にスローされますが、...まあ、ありません。足りないものはありますか?どうすればこれを機能させることができますか?

4

2 に答える 2

2

countryにを含めますSELECT

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  
于 2012-12-03T01:34:21.287 に答える
0

問題は、HAVING 句の count(ship) にあります。それが select ステートメントの集計関数だと思います。

于 2012-12-03T00:17:43.153 に答える