SQL:使用相同的“GROUP BY ORDER BY”和相同的行数追加两个查询

时间:2013-05-31 14:35:43

标签: sql group-by subquery

我有以下查询:

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)。它确实返回了一些东西,但结果是错误的。

而不是返回我需要的内容(即数量的游戏),它似乎返回participantscountParticipants参与的游戏数量(给定的国家)。

现在,问题来自我的数据库中的数据,或者来自我的查询。你能检查一下吗,所以我知道在哪里纠正这个问题?

非常感谢

注意:两个子查询的resultSet返回相同的行数,并以相同的方式排序。

2 个答案:

答案 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,它根据传递给它的列进行小计。

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

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