SQL - ORDER BY 不返回结果
Posted
技术标签:
【中文标题】SQL - ORDER BY 不返回结果【英文标题】:SQL - ORDER BY not returning results 【发布时间】:2017-02-08 14:58:50 【问题描述】:我正在努力解决这个挑战(不要求最终解决方案)! Problem Link
第一步:我想返回城市列表,length(city) 按长度排序,使用比ROWNUMBER = 1
。
选择名称最短的城市:
我的代码是:
SELECT DISTINCT city, LENGTH(city) FROM station ORDER BY LENGTH(city) ASC;
我希望结果按 LENGTH 排序,但它是按城市排序的。如果我改为:
SELECT DISTINCT city, LENGTH(city) FROM station ORDER BY city DESC;
仍然是按城市按 ASC 顺序排序。
我做错了什么?或者是页面有问题,因为即使SELECT city FROM station ORDER by city DESC;
也不起作用。
谢谢。
【问题讨论】:
您的第一个查询应该没问题。 (但是,我会做SELECT DISTINCT city, LENGTH(city) as len FROM station ORDER BY len ASC;
)
在我看来页面有问题。第一个查询没有问题。
我仍然倾向于使用 Gordon 的版本,当使用 DISTINCT
时,每行都会调用 LEN
函数,然后删除重复项,而使用 GROUP BY
时删除重复项首先,然后在其余记录上调用 LEN
函数。对于像LEN
这样开销非常低的东西,并且取决于重复的数量,这是一个相当微不足道的优化,但对于其他功能(特别是用户定义的)或存在大量重复的数据,这可能更重要。
【参考方案1】:
这可能取决于数据库,但似乎distinct
可能会在order by
之后处理。只需使用GROUP BY
:
SELECT city, LENGTH(city)
FROM station
GROUP BY city
ORDER BY LENGTH(city) ASC;
【讨论】:
我发誓这不是我的反对意见,但这不会在大多数 RDBMS 中运行,因为您按一列分组,而在另一列中没有使用聚合函数......所以我不是真的确定赞成... GROUP BY 时不需要聚合函数。但是, DISTINCT 应该在 ORDER BY 之前(逻辑上)进行处理,即使不是 - 也没有关系。原始查询应返回预期结果。 @Lamak 我所知道的大多数 DBMS 都足够聪明地认识到LEN(City)
在功能上依赖于 City
,因此会允许它
@Lamak 。 . .当然,这适用于任何数据库。您可以在 group by
键上运行函数。 GROUP BY
键是city
; LENGTH()
只是将其作为参数。
@jarlh 。 . .注意第一句话。 OP 使用的任何数据库似乎都没有遵守该约定(或者它是一个标准)。以上是关于SQL - ORDER BY 不返回结果的主要内容,如果未能解决你的问题,请参考以下文章
MySQL ORDER BY 根据日期时间查询返回不正确的结果
oracle SQL语句中结合order by子句使用rownum