我为MySql
编写了一个使用LIMIT和GROUP BY关键字的查询。它在MySql上工作正常。查询是:
SELECT
tester,
firstname,
COUNT(*) total
FROM mnrelease_details a LEFT JOIN users b ON tester='guest'
WHERE a.project='testpro'
GROUP BY tester ORDER BY total ASC LIMIT 10;
我尝试将其翻译为T-Sql以便在Sql Server上使用。以下是Sql Server
的内容:
SELECT TOP 10
tester,
firstname,
COUNT(*) total
FROM mnrelease_details a
LEFT JOIN users b ON tester='guest'
WHERE a.project='testpro'
GROUP BY tester ORDER BY total ASC;
但是,当我尝试在Sql Server上使用它时,我收到此错误:
列' users.firstname'在选择列表中无效,因为它是 不包含在聚合函数或GROUP BY子句中。
为什么Sql Server不允许这样做?为什么Sql Server不允许使用单个GROUP BY而不是添加GROUP BY
中的所有列?我只想按tester
列进行分组,就像我使用MySql一样。
答案 0 :(得分:2)
如果你有这样的数据怎么办?
tester firstname ------ --------- 1 Joe 2 Bob 2 Fred
你期望为测试者2出现哪个名字:鲍勃,还是弗雷德?如果您需要两者,请自行将该列添加到组中,因为firstname列是已定义组的一部分。如果您不在乎,那么只需选择MIN()
或MAX()
这样的聚合函数:它无所谓。如果你关心,那么你需要在查询中构建一些东西,告诉它如何从正确的记录中选择值。
关键是原始查询可能不明确。也许你有数据这样从来没有问题,但查询引擎并不知道这一点。 MySql在这里的行为实际上是错误的行为,并且与ansi sql标准不同(至少对于sql-92和之前的行为)。
答案 1 :(得分:0)
正如错误消息所示,SQL Server对GROUP BY子句上的非聚合字段是严格的,因此它不允许这样做,您需要将firstname
字段添加到GROUP BY
tester
之后的{}假设测试者是唯一的并且每个具有相同的firstname
。
您可以查看MySQL Handling of GROUP BY以获取有关此问题的更多信息。