如何修复MS SQL Server中的“聚合可能不会出现在WHERE子句中”错误

时间:2019-01-11 16:52:05

标签: mysql

对于一个学校项目,我需要在MS SQL Server中创建一些数据库,创建一些视图,并管理用户访问权限。事实是,我们的课程确实是空的,我在MS SQL Server的某些机制上遇到了麻烦

我为2018年世界杯足球赛的每位球员提供一张桌子,我想选20名最矮的球员,所以我只想使用ORDER BY Person.Height。如果我使用它,我的结果将是这样的:

62    165    Panama    QA19
63    165    SaudiArabia    AY8
78    165    Switzerland SX23
59    166    Mexico    AJ20
etc...

但是我只想选择最矮的球员,并按国家(而不是身高)排序,所以有这样的东西

69    168    Argentina   SE18
66    168    Argentina   LM15
67    166    Brazil    CF22
64    169    Brazil    RF18

国家/地区按字母顺序排列的20个最矮的球员

这是我现在拥有的代码,这给了我第一个结果

SELECT TOP (20) Person.Weight, Person.Height, Country.NameCountry,                     
LEFT(Person.Name, 1)+LEFT(Person.FirstName, 1)+CAST(Player.Numero AS 
nvarchar(MAX)) AS Initiales

FROM Person INNER JOIN Country 
ON Person.CountryId = Country.CountryID 
INNER JOIN Player 
ON Person.PersonID = Player.PersonID

WHERE -----------------
ORDER BY Person.Height, Country.NameCountry

如果我在WHERE子句中使用MIN(Person.Height),则会出现此错误:除非在HAVING子句或选择列表中包含的子查询中,否则聚合可能不会出现在WHERE子句中,并且正在汇总的列是外部参考。 但是我不需要任何HAVING OR GROUP BY子句,所以我真的不明白我应该做什么。 我知道我的解释不是很清楚,但是如果有人可以帮助我,那将非常好

2 个答案:

答案 0 :(得分:0)

尝试使用子查询

SELECT * FROM (
    SELECT Person.Weight, Person.Height, Country.NameCountry,                     
    LEFT(Person.Name, 1)+LEFT(Person.FirstName, 1)+CAST(Player.Numero AS 
    nvarchar(MAX)) AS Initiales
    FROM Person INNER JOIN Country 
    ON Person.CountryId = Country.CountryID 
    INNER JOIN Player 
    ON Person.PersonID = Player.PersonID
    WHERE -----------------
    ORDER BY Person.Height
    LIMIT 0,20)
ORDER NameCountry

答案 1 :(得分:0)

好吧,使用子查询效果很好,谢谢Omar Matijas