在SQL中将WITH语句重写为子查询语句?
发布时间:2020-12-12 07:26:28 所属栏目:MsSql教程 来源:网络整理
导读:我有以下两种关系: Game(id,name,year)Devs(pid,gid,role) Game.id是主键,Devs.gid是Game.id的外键. 在previous post I made here中,另一位用户非常友好地帮助我创建了一个查询,该查询可以找到大多数开发人员制作该游戏的所有游戏.他的答案使用了WITH语句,我
我有以下两种关系:
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,Game.name) GamesDevs WHERE GamesDevs.DevsCount = (SELECT MAX(DevsCount) FROM GamesDevs) 据我所知,这两个查询应该是相同的.但是,当我尝试运行第二个查询时,我收到错误
有谁知道为什么我可能会收到此错误,或者为什么这两个查询不相同? 解决方法您将需要在最后一个子句中复制该子查询,如:SELECT * FROM (SELECT Game.name AS GameName,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 Server索引中include的魅力[具有包含性列的索引]
- Mysql 数据库死锁过程分析(select for update)
- SQLServer里10万的表成为运行瓶颈的问题
- .net – Linq with Left Join on SubQuery contains Count
- 一个简单的SQL 行列转换语句
- sql-server – 锁定在我自己的SQL服务器之外
- 我的提高班学习状况_有感_04.02
- SQLServer中获取所有数据库名、所有表名、所有字段名的SQL语
- exchange-2007 – 何时在Exchange 2007数据库上运行eseutil
- sql-server – SQL Server:为什么GUID的第15个char总是4?