0

查询在 MySQL 中工作正常,但在 MSSQL 中不行。小提琴:

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

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

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

4

2 回答 2

4

该查询之所以有效,MySQL是因为它具有Extended GROUP BY. 如果启用SQL 模式,MySQL则可以限制此行为。ONLY_FULL_GROUP_BY

但是在 中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;
于 2013-03-25T02:09:23.670 回答
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 值,您可能会得到任何匹配的名称。

于 2013-03-25T04:31:46.467 回答