查询在 MySQL 中工作正常,但在 MSSQL 中不行。小提琴:
MySQL:http ://sqlfiddle.com/#!8/f1959/2
MSSQL:http ://sqlfiddle.com/#!6/4d276/2
似乎 MySQL 让它工作的事实将使查询速度更快,因为 int 的搜索速度比可变长度字符串更快。
查询在 MySQL 中工作正常,但在 MSSQL 中不行。小提琴:
MySQL:http ://sqlfiddle.com/#!8/f1959/2
MSSQL:http ://sqlfiddle.com/#!6/4d276/2
似乎 MySQL 让它工作的事实将使查询速度更快,因为 int 的搜索速度比可变长度字符串更快。
该查询之所以有效,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;
下面是两个 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 值,您可能会得到任何匹配的名称。