在SQL中将WITH语句重写为子查询语句?

Kyl*_*yle 7 sql with-statement azure-sql-database

我有以下两种关系:

Game(id, name, year)
Devs(pid, gid, role)
Run Code Online (Sandbox Code Playgroud)

Game.id是主键,Devs.gid是Game.id的外键.

我之前发表的一篇文章中,另一位用户非常友好地帮助我创建了一个查询,该查询可以找到大多数开发者制作该游戏的所有游戏.他的回答使用了WITH语句,我对这些并不十分熟悉,因为我只用了几周时间学习SQL.这是工作查询:

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
)

SELECT * FROM GamesDevs WHERE GamesDevs.DevsCount = (SELECT MAX(DevsCount) FROM GamesDevs)
Run Code Online (Sandbox Code Playgroud)

为了更熟悉SQL,我试图使用子查询而不是WITH语句重写此查询.我一直在使用这个Oracle文档来帮助我解决这个问题.我尝试重写这样的查询:

SELECT *
FROM (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) GamesDevs
WHERE GamesDevs.DevsCount = (SELECT MAX(DevsCount) FROM GamesDevs)
Run Code Online (Sandbox Code Playgroud)

据我所知,这两个查询应该是相同的.但是,当我尝试运行第二个查询时,我收到错误

消息207,级别16,状态1,行6无效的列名称'DevsCount'.

有谁知道为什么我可能会收到此错误,或者为什么这两个查询不一样?

Gio*_*uri 4

您将需要在最后一个 from 子句中复制该子查询,例如:

SELECT *
FROM (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) GamesDevs
WHERE GamesDevs.DevsCount = (SELECT MAX(DevsCount) FROM (SELECT Game.name AS GameName, count(DISTINCT Devs.pid) AS DevsCount
    FROM Game
    INNER JOIN Devs ON Devs.gid=Game.id
    GROUP BY Devs.gid, Game.name))
Run Code Online (Sandbox Code Playgroud)

但最好这样做:

SELECT TOP 1 WITH TIES Game.name AS GameName, count(DISTINCT Devs.pid) AS DevsCount
FROM Game
INNER JOIN Devs ON Devs.gid=Game.id
GROUP BY Devs.gid, Game.name
ORDER BY DevsCount DESC
Run Code Online (Sandbox Code Playgroud)