【问题标题】:SQL : Append two queries with same "GROUP BY ORDER BY" and same number of rowsSQL:附加两个具有相同“GROUP BY ORDER BY”和相同行数的查询
【发布时间】:2013-05-31 14:35:42
【问题描述】:

我有以下问题:

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

它似乎返回了participantsin countParticipants 参与的游戏数量(对于给定的国家/地区),而不是返回我需要的内容(即游戏数) .

现在,问题来自我的数据库中的数据,或者来自我的查询。能否请您检查一下,以便我知道在哪里更正问题?

非常感谢

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

【问题讨论】:

  • 你知道GROUP BY是做什么的吗?
  • 是的,我知道它的作用。我有更多的中级 SQL 级别:)
  • 你需要一个聚合来使用它。
  • 你确定你不需要表 q1 和 q2 之间的任何关系吗?
  • @FreshPrinceOfSO 你能举个例子吗?

标签: sql group-by subquery


【解决方案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 连接并没有错,并且通常会创建相同的执行计划,但我相信使用它们的原因要超过不使用它们的原因。

【讨论】:

  • 不错!谢谢 :) 我不知道连接的技巧。这篇文章似乎也很有趣ü
【解决方案2】:

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

这里是一些汇总示例的链接:

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

【讨论】:

    猜你喜欢
    • 2019-01-21
    • 2021-11-17
    • 2015-05-05
    • 1970-01-01
    • 1970-01-01
    • 2022-01-15
    • 2011-03-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多