查询在MySQL中运行良好,但在MSSQL中运行不正常。小提琴:
MySQL:http://sqlfiddle.com/#!8/f1959/2
MSSQL:http://sqlfiddle.com/#!6/4d276/2
似乎MySQL让它工作的事实会带来更快的查询,因为int的搜索速度会比可变长度的字符串更快。
答案 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值,则可以获得任何匹配的名称。