扩展排序键列
您想要执行的操作不起作用的原因是由于SQL中的逻辑操作顺序,对于您的第一个查询,该操作的顺序是(简化的):
FROM MonitoringJob
SELECT Category, CreationDate
即添加一个所谓的扩展排序键列
ORDER BY CreationDate DESC
SELECT Category
即再次从结果中删除扩展的排序键列。
因此,由于采用了SQL标准扩展的排序键列功能,因此完全有可能按SELECT
子句中未包含的内容进行排序,因为它是在后台临时添加的。
那么,为什么不起作用DISTINCT
呢?
如果我们添加DISTINCT
操作,则会在SELECT
和之间添加ORDER BY
:
FROM MonitoringJob
SELECT Category, CreationDate
DISTINCT
ORDER BY CreationDate DESC
SELECT Category
但是现在,随着 扩展的排序键列 CreationDate
,DISTINCT
操作的语义已更改,因此结果将不再相同。这不是我们想要的,因此SQL标准和所有合理的数据库都禁止这种用法。
解决方法
可以使用以下标准语法进行仿真
SELECT Category
FROM (
SELECT Category, MAX(CreationDate) AS CreationDate
FROM MonitoringJob
GROUP BY Category
) t
ORDER BY CreationDate DESC
或者,只是简单地(在这种情况下),如Prutswonder所示
SELECT Category, MAX(CreationDate) AS CreationDate
FROM MonitoringJob
GROUP BY Category
ORDER BY CreationDate DESC
我在这里已详细介绍了SQL DISTINCT和ORDER BY。