“[columnname]不包含在聚合函数或GROUP BY子句中。”

时间:2013-03-25 02:08:32

标签: sql sql-server sql-server-2012

查询在MySQL中运行良好,但在MSSQL中运行不正常。小提琴:

MySQL:http://sqlfiddle.com/#!8/f1959/2

MSSQL:http://sqlfiddle.com/#!6/4d276/2

似乎MySQL让它工作的事实会带来更快的查询,因为int的搜索速度会比可变长度的字符串更快。

2 个答案:

答案 0 :(得分:4)

该查询适用于MySQL,因为它具有Extended GROUP BY的功能。如果启用ONLY_FULL_GROUP_BY SQL模式,则可以限制MySQL中的此行为。

但在SQL Server中,您需要显式定义GROUP BY子句中未聚合的所有列,这些列在SELECT子句中定义

SELECT t.name, COUNT(d.data)
FROM   types AS t
       LEFT JOIN data AS d ON d.typeId = t.id
GROUP  BY d.typeId, t.name;

答案 1 :(得分:1)

以下是两个SQL Server查询(SQL Fiddle),它们可以为您提供所需的结果,而无需额外的GROUP BY项目。

SELECT t.name, a.ct
FROM types AS t
OUTER APPLY (
  SELECT COUNT(d.data) AS ct
  FROM data AS d
  WHERE d.typeId = t.id
) as A

SELECT
  t.name,
  (SELECT COUNT(d.data)
   FROM data AS d
   WHERE d.typeId = t.id
  ) AS ct
FROM types AS t

在任何一种情况下(如在MySQL中),您应该确定types.name和types.id之间存在一对一的关系。至少在SQL Server中,如果不是这样,结果就是明确定义的。在MySQL中,如果给定types.id有多个types.name值,则可以获得任何匹配的名称。