我正在完成CMU公共数据库系统课程的一个问题集。我有以下两张表:
为
官方解决方案是一个非常糟糕的解决方案,因为它在同一个表Order
上聚合两次,然后将结果连接起来,而通过单个聚合查询(如您的第一个查询)可以实现相同的结果。
我不能相信这将被提议作为这类问题的适当解决方案。
我希望这只是练习连接子查询
另外,看到表(或列)名/别名使用单引号,我感到非常失望。
这是一个非常糟糕的做法,它会导致意想不到的结果。
在需要的时候使用双引号,这是SQL的标准(方括号或反引号在SQLite中也可以使用)。
正如我所说,你的第一个查询是正确的,它可以通过使用聚合函数AVG()
进一步简化:
SELECT S.CompanyName,
ROUND(100*AVG(COALESCE(O.ShippedDate, '') > O.RequiredDate), 2) AS percent
FROM Shipper AS S JOIN "Order" AS O
ON O.ShipVia = S.Id
GROUP BY S.Id
ORDER BY percent DESC;
注意在
GROUP BY
子句中使用了Id
(它是Shipper
的主键)而不是CompanyName
,这样可以提供更好的性能。此外,我使用COALESCE()
,因为我发现(在下载您的数据库后)在列ShippedDate
中有null
s。