SQL聚合函数,内部联接

SQL聚合函数,内部联接,sql,Sql,我正在编写一个sql来获取SID和SNAME。在这个任务中,我需要计算哪支球队赢得最多的联赛冠军,并找出SID 联赛(LID、冠军\ TID) LID:联盟ID;冠军队:冠军队ID 支架(SID,盖) 赞助商(SID、SNAME) 主键:LID,SID 现在,我可以通过以下SQL查询哪个球队赢得最多的联赛冠军: SELECT MAX(y.cham) FROM (SELECT CHAMPION_TID, COUNT(L.CHAMPION_TID) AS

我正在编写一个sql来获取SID和SNAME。在这个任务中,我需要计算哪支球队赢得最多的联赛冠军,并找出SID

  • 联赛(LID、冠军\ TID)
  • LID:联盟ID;冠军队:冠军队ID
  • 支架(SID,盖)
  • 赞助商(SID、SNAME)
  • 主键:LID,SID
现在,我可以通过以下SQL查询哪个球队赢得最多的联赛冠军:

SELECT 
    MAX(y.cham) 
FROM 
    (SELECT 
         CHAMPION_TID, COUNT(L.CHAMPION_TID) AS cham 
     FROM 
         LEAGUES L 
     GROUP BY 
         L.CHAMPION_TID) y, LEAGUES L 
WHERE
    y.CHAMPION_TID = L.CHAMPION_TID;
我在下面的步骤中感到困惑。我的想法是先打开盖子,然后使用联接表来显示SID和SNAME。但我在这一步很糟糕

SELECT L.LID, MAX(y.cham) 
FROM 
    (SELECT CHAMPION_TID, COUNT(L.CHAMPION_TID) AS cham 
     FROM LEAGUES L 
     GROUP BY L.CHAMPION_TID) y, LEAGUES L 
WHERE 
    y.CHAMPION_TID = L.CHAMPION_TID

您可以使用以下内容查找赞助商ID和赞助商名称:

SELECT DISTINCT 
    sp.SID,
    sp.SNAME
FROM
    LEAGUES l3
INNER JOIN support s ON
    l3.LID = s.LID
INNER JOIN SPONSORS sp ON
    s.SID = sp.SID
WHERE
    l3.CHAMPION_TID IN (
    SELECT
        l2.CHAMPION_TID
    FROM
        LEAGUES l2
    GROUP BY
        l2.CHAMPION_TID
    HAVING
        count(l2.CHAMPION_TID) = (
            SELECT
                count(l1.CHAMPION_TID)
            FROM
                LEAGUES l1
            GROUP BY
                l1.CHAMPION_TID
            ORDER BY
                count(l1.CHAMPION_TID) DESC 
            FETCH FIRST 1 ROW ONLY 
        ) 
    );
它在
联盟
中查找
CHAMPION\u TID
的计数,按
desc
排序(这样最高的计数总是在顶部),然后使用它查找相关的
CHAMPION\u TID
。它还为
max(count(CHAMPION\u TID))处理领带

如果
fetch first 1 row only
不起作用,您可以使用
select top 1 l1.CHAMPION\u TID..


这是一个使用Postgres的例子。

记录可能不止一个,因为他们可能赢得相同数量的冠军。抱歉,问题不清楚,我只显示了表的一部分。我使用的是oracle数据库,因此我只使用fetch前1行。顺便说一句,谢谢提醒。@jay我已经相应地更新了答案,工作演示链接也更新了。-在ANSI-92 SQL标准(大约30年前)中,旧样式的逗号分隔表列表样式被正确的ANSI
JOIN
语法所取代,不鼓励使用它