SQL聚合函数,内部联接
我正在编写一个sql来获取SID和SNAME。在这个任务中,我需要计算哪支球队赢得最多的联赛冠军,并找出SIDSQL聚合函数,内部联接,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
- 联赛(LID、冠军\ TID)
- LID:联盟ID;冠军队:冠军队ID
- 支架(SID,盖)
- 赞助商(SID、SNAME)
- 主键:LID,SID
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年前)中,旧样式的逗号分隔表列表样式被正确的ANSIJOIN
语法所取代,不鼓励使用它