我有以下两个关系:
Game(id, name, year)
Devs(pid, gid, role)
其中Game.id是主键,而Devs.gid是Game.id的外键。
我想编写一个SQL查询,以查找从事该游戏工作的人员最多的游戏。我写了以下查询:
SELECT Game.name, count(DISTINCT Devs.pid)
FROM Game, Devs
WHERE Devs.gid=Game.id
GROUP BY Devs.gid, Game.name
ORDER BY count(Devs.pid) DESC;
从某种意义上说,该查询可以实现我的目标,即返回关系中的所有Games,该关系按按每个游戏工作的人数排序,但是我试图修改此查询,以便它可以做两件事。一,它只应返回参与该游戏的人员最多的游戏,二,如果有两个具有相同工作量的游戏,则应同时返回这两个游戏。我知道如果我这样替换顶行:
SELECT TOP 1 Game.name, count(DISTINCT Devs.pid)
然后,它实现了我的第一个目标,但是如果有两个游戏都拥有最多的开发人员,那么它只会返回其中一个游戏。我该如何更改此查询,以便它返回从事该工作的人数最多的所有游戏?
任务可以简化为:
给我原始查询中所有开发人员最多的行
可以通过WITH
声明来达到目的。答案如下:
WITH GamesDevs (GameName, DevsCount)
AS
(
SELECT Game.name AS GameName, count(DISTINCT Devs.pid) AS DevsCount
FROM Game, Devs
WHERE Devs.gid=Game.id
GROUP BY Devs.gid, Game.name
ORDER BY count(Devs.pid) DESC
)
SELECT * FROM GamesDevs WHERE GamesDevs.DevsCount = (SELECT MAX(DevsCount) FROM GamesDevs)
希望这可以帮助。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句