按条款提问

时间:2011-01-16 14:44:20

标签: sql-server

我们可以对SELECT子句中不存在的列进行排序吗?为什么呢?

3 个答案:

答案 0 :(得分:5)

这取决于DBMS(通常是DBMS的版本 - 旧版本比新版本更严格)。

现在,大多数DBMS确实允许您对选择列表中未列出的列进行排序。但是,早期的SQL标准当然要求ORDER BY子句中的列也出现在select-list中。

DBMS通过将未选择的列添加到结果集,排序,然后投射(丢弃)未选择的列来处理它。

请注意,使用该技术意味着数据顺序通过简单地查看数据来传达不可用的信息 - 所谓的基本排序。这通常不是一个好主意(但它足够流行,大多数DBMS允许你这样做)。

答案 1 :(得分:3)

ORDER BY将引用FROM子句中的表,除非DISTINCT或GROUP BY修改了排序的语义。

这是确定,因为来自mytable1的信息可用:

SELECT col1, col3, FROM mytable1 ORDER BY col2

失败因为col2在DISTINCT之后没有任何意义:

SELECT DISTINCT col1, col3, FROM mytable1 ORDER BY col2

当col1,col3被DISTINCT折叠时,你会失去col2的值。这同样适用于GROUP BY(DISTINCT实际上是一个简单的GROUP BY)。

答案 2 :(得分:0)

当DBMS是SQL-Server时,答案是肯定的。但我注意到标签是由Jonathan编辑的,也许这个答案不适用于你的系统。