0

我有以下查询:

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) 中发生的奥运会的参与者人数以及在同一(q2)中发生的总比赛数。countryName它确实返回了一些东西,但结果是错误的。

而不是返回我需要的东西(即游戏总数),它似乎返回了参与的游戏数量participantscountParticipants对于给定的国家)。

现在,要么问题来自我的数据库中的数据,要么来自我的查询。你能检查一下,以便我知道在哪里更正这个问题吗?

非常感谢

注意:两个子查询的结果集返回相同数量的行并且以相同的方式排序。

4

2 回答 2

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 连接,请阅读本文。尽管 ANSI 89 连接并没有错,并且通常会创建相同的执行计划,但我相信使用它们的原因被不使用它们的原因所权衡。

于 2013-05-31T14:45:47.990 回答
0

Oracle 有一个很好的聚合函数,称为汇总,它根据传递给它的列进行小计。

以下是一些汇总示例的链接:

http://www.compshack.com/sql/oracle-group-rollup

于 2013-05-31T14:42:59.167 回答