我有以下两种关系:
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)
据我所知,这两个查询应该是相同的.但是,当我尝试运行第二个查询时,我收到错误 …
我学习 SQL 已经几周了,刚刚完成了一个关于使用 IN 和 NOT IN 的家庭作业问题。我设法得到了正确的答案,但是,我使用了 EXCEPT 子句,但我们实际上还不允许使用该子句。据我所知,EXCEPT 和 NOT IN 在 SQL 中是非常相似的语句,但我不明白有什么区别。这是我的查询的一般格式:
SELECT *
FROM table
WHERE x IN (
SELECT x
/* ... some subquery*/
EXCEPT
SELECT x
/* ... some other subquery*/
)
Run Code Online (Sandbox Code Playgroud)
有没有办法重写这个通用查询而不使用 EXCEPT 语句?EXCEPT 和 NOT IN 一般有何不同?
编辑:另一篇文章似乎有一些很好的信息,但它似乎专注于 EXISTS 而不是 IN,它们有不同的目的,不是吗?