我有以下查询:
SELECT q2.name, q1.countParticipants, q2.countGames FROM
(
SELECT c.countryName AS name, count(p.idParticipant) AS countParticipants
FROM Country c, Participant p, Game g
WHERE p.fkGame = g.idGame AND c.idCountry = p.fkCOuntry AND c.countryName LIKE '%$countryName%'
GROUP BY c.countryName
ORDER BY c.countryName;
) AS q1 ,
(
SELECT c.countryName AS name, count(g.idGame) as countGames
FROM Country c, Game g
WHERE c.idCountry = g.fkHostCountry AND c.countryName LIKE '%$countryName%' GROUP BY c.countryName
ORDER BY c.countryName)
) AS q2
GROUP BY q1.name
ORDER BY q1.name
该查询应该返回在特定countryName
(q1)中发生的奥运会参与者数量以及发生在总游戏中的数量相同的countryName
(q2)。它确实返回了一些东西,但结果是错误的。
而不是返回我需要的内容(即总数量的游戏),它似乎返回participants
中countParticipants
参与的游戏数量(给定的国家)。
现在,问题来自我的数据库中的数据,或者来自我的查询。你能检查一下吗,所以我知道在哪里纠正这个问题?
非常感谢
注意:两个子查询的resultSet返回相同的行数,并以相同的方式排序。
答案 0 :(得分:1)
您可以使用一个查询并使用COUNT(DISTINCT
。
SELECT c.countryName AS name,
COUNT(p.idParticipant) AS countParticipants ,
COUNT(DISTINCT g.idGame) AS CountGames
FROM Country c
INNER JOIN Participant p
ON c.idCountry = p.fkCOuntry
INNER JOIN Game g
ON p.fkGame = g.idGame
WHERE c.countryName LIKE '%$countryName%'
GROUP BY c.countryName
ORDER BY c.countryName;
如果您想知道为什么我将隐式ANSI 89连接更改为显式ANSI 92连接,请给this article一个读取。虽然ANSI 89连接没有错,并且通常创建相同的执行计划,但我相信使用它们的原因是由于不使用它们的原因而被权衡。
答案 1 :(得分:0)
Oracle有一个很好的聚合函数叫做rollup,它根据传递给它的列进行小计。
以下是汇总一些示例的链接: