分组中的许多字段

时间:2014-05-17 20:36:28

标签: sql

我现在正在学习SQL,我有一个问题。我最近遇到了一个查询,它在group by子句中处理了大量的列名。我之前使用过group by子句,而且我只看到过一个列名。

SELECT        TransportType.Description, TransportType.CargoCapacity, TransportType.Range, Transport.SerialNumber, Transport.PurchaseDate, Transport.RetiredDate, 
                         MAX(Repair.BeginWorkDate) AS LatestRepairDate

FROM            Transport INNER JOIN
                         TransportType ON Transport.TransportTypeID = TransportType.TransportTypeID LEFT OUTER JOIN
                         Repair ON Transport.TransportNumber = Repair.TransportNumber

GROUP BY TransportType.Description, TransportType.CargoCapacity, TransportType.Range, Transport.SerialNumber, Transport.PurchaseDate, 
                         Transport.RetiredDate

HAVING        (Transport.RetiredDate IS NULL)

ORDER BY TransportType.Description, Transport.SerialNumber

为什么group by子句中有这么多列?

1 个答案:

答案 0 :(得分:1)

除了MySQL和SQLite(对GROUP BY宽容,有时候结果不确定),大多数RDBMS要求MAX(),MIN(),SUM(),COUNT()列表中出现的每个非聚合列(SELECT等)都在{ {1}}。

MySQL&的行为当GROUP BY中的列SELECT未列在GROUP BY中时,SQLite的定义不明确。例如,您执行如下查询:

SELECT firstname, lastname, COUNT(*) FROM names GROUP BY lastname

MySQL会毫无怨言地给你一个结果。

但是,如果您的表格包含两个firstname具有相同lastname的不同值,那么您的结果COUNT(*)会计算两个,而只返回一个firstname个。更重要的是, firstname MySQL选择返回的没有被定义,因此您无法真正依赖它返回该对中的第一个,例如

从表格中如下:

firstname, lastname
--------------------
Jane       Smith
John       Smith
Peter      Jones

不完全正确的结果可能是:

firstname, lastname, COUNT(*)
-----------------------------
Jane       Smith     2  <----wrong!
Peter      Jones     1

MySQL之外&amp; SQLite,SELECT列表中任何位置引用的列也不会出现在GROUP BY中,这将导致查询解析错误。

通常在Stack Overflow上,我们会遇到有关GROUP BY的问题的用户,他们刚开始使用更严格的使用RDBMS。如果您首先在MySQL中学习聚合,那么在迁移到不同的RDBMS时,您可能需要重新学习它们。