sql - 将 WITH 语句重写为 SQL 中的子查询语句?

标签 sql azure-sql-database with-statement

我有以下两个关系:

Game(id, name, year)
Devs(pid, gid, role)

其中 Game.id 是主键,而 Devs.gid 是 Game.id 的外键。

previous post I made here ,另一位用户非常友好地帮助我创建了一个查询,该查询查找由制作该游戏的大多数开发人员制作的所有游戏。他的回答使用了 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)

为了更加熟悉 SQL,我尝试使用子查询而不是 WITH 语句重写此查询。我一直在用 this Oracle documentation帮我弄清楚。我尝试像这样重写查询:
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)

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

Msg 207, Level 16, State 1, Line 6 Invalid column name 'DevsCount'.



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

最佳答案

您需要在最后一个 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))

但最好这样做:
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

关于sql - 将 WITH 语句重写为 SQL 中的子查询语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29789521/

相关文章:

python - 依赖 python 的 with...as 语句是一种好习惯吗

python - 使用 Python 'with' 语句时捕获异常 - 第 2 部分

SQL 删除触发器不工作

Javascript 沙箱

sql - 在多个列中的每个列上选择不重复

sql - Azure SQL 定价

azure - Sql Azure - 无法解释的锁定

sql - Azure 自动备份频率

sql - 如何更改架构名称并将表移至另一个架构?

mysql - SQL查询仅返回重复项的最大值[duplicate]