【SQL SERVER】如果指定了 SELECT DISTINCT,那么 ORDER BY 子句中的项就必须出现在选择列表中
2016-12-07 09:50
615 查看
1:sqlserver中如果用order by,同时用了distinct的话,order by后面的字段就必须出现在selcet的字段中。
select distinct FullName from users order by Id
上述 SQL 语句是不对的,会提示错误:
80040e14 如果指定了 SELECT DISTINCT,那么 ORDER BY 子句中的项就必须出现在选择列表中。
应该为:
select distinct Id, FullName from users order by Id
2:那么如果我们不加distinct呢?
如果不加distinct,那么select distinct FullName
from users order by Id就是正确的。
3:这个问题经过测试,只有在sqlserver中才会有,MySQL中是不会有这个问题的。
4:下面我们来看看原理啊,为什么会出现上面的情况呢?
加了distinct后,distinct字段自带排序功能,会先按照distinct后面的字段进行排序。
order by可以改变distinct自带的排序,从而达到你想要的排序效果,而不是distinct的排序效果。
distinct是怎么排序的,以及它是怎么去重复的,可以看sql的执行计划。
5:综上,其实就是一个执行先后顺序问题,没有distinct关键字的时候,order by关键字先执行,select 关键字后执行,有了distinct,selcet distinct关键字先执行,order by后执行,如果select distinct执行完后,字段都没有了,那么order by怎么排序呢?
当然,上面已经说了,只有sqlserver会有这个问题,mysql就没有这个问题,这个和它们各自设计时的理解不同。
select distinct FullName from users order by Id
上述 SQL 语句是不对的,会提示错误:
80040e14 如果指定了 SELECT DISTINCT,那么 ORDER BY 子句中的项就必须出现在选择列表中。
应该为:
select distinct Id, FullName from users order by Id
2:那么如果我们不加distinct呢?
如果不加distinct,那么select distinct FullName
from users order by Id就是正确的。
3:这个问题经过测试,只有在sqlserver中才会有,MySQL中是不会有这个问题的。
4:下面我们来看看原理啊,为什么会出现上面的情况呢?
加了distinct后,distinct字段自带排序功能,会先按照distinct后面的字段进行排序。
order by可以改变distinct自带的排序,从而达到你想要的排序效果,而不是distinct的排序效果。
distinct是怎么排序的,以及它是怎么去重复的,可以看sql的执行计划。
5:综上,其实就是一个执行先后顺序问题,没有distinct关键字的时候,order by关键字先执行,select 关键字后执行,有了distinct,selcet distinct关键字先执行,order by后执行,如果select distinct执行完后,字段都没有了,那么order by怎么排序呢?
当然,上面已经说了,只有sqlserver会有这个问题,mysql就没有这个问题,这个和它们各自设计时的理解不同。
相关文章推荐
- 如果指定了 SELECT DISTINCT,那么 ORDER BY 子句中的项就必须出现在选择列表中
- 如果指定了 SELECT DISTINCT,那么 ORDER BY 子句中的项就必须出现在选择列表中。(sqlserver中)
- 关于sql视图--定义视图的查询不能包含order by子句,除非在select 语句的选择列表中还有top子句---问题解决
- 安装SQL Server 2000时出现以下错误提示:“以前的某个程序安装已在安装计算机创建挂起的文件操作,运行安装程序之前必须重新启动计算机” 说明:如果重启计算机无法解决问题,可能有以下两个原因
- create index 索引的第一列必须是select 语句的where 子句中指定的列之一
- mysql distinct和order by 一起用时,order by的字段必须在select中
- 聚合不应出现在 WHERE 子句中,除非该聚合位于 HAVING 子句或选择列表所包含
- 模块列表中不存在此处理程序所需的指定模块,如果你添加脚本映射处理程序映射,则IsapiModule或CgiModule必须在模块列表中
- 关于SQL Server 2008 安装时提示“未指定 INSTANCESHAREDWOWDIR 命令行值。如果指定INSTANCESHAREDDIR 值,则必须指定该值”错误的问题
- SQL Server如何得到用户的继承列表 选择自 liufuyahong 的 Blog
- 在.NET中如果不指定存储过程参数的长度出现的情况
- 如果我们不选择堕落,那么地狱的存在又有何意义?
- 用createprocess执行word,需要为外部程序指定一个叁数'd:\aaa.doc',如果这个文档是stringlist中的某一项,那么该如何写呢?
- 学习:根据指定字段排序编号(SQL Server 2005,Update,Order By) (转)
- 如果你想推荐本文到CSDN 技术中心,请选择下列的文章分类之一。文章保存时将自动提交到CSDN技术中心,通过审核后本文将出现在您的CSDN 技术中心的专栏中。如果您不希望本文被提交到CSDN技术中心,请选择"不发表到CSDN技术中心"。注:还没有C
- 如果不写Order By子句,会怎么样
- 安装SQL Server 2000的时候出现“以前的某个程序安装已在安装计算机上创建挂起的文件操作。运行安装程序之前必须重新启动计算机”的解决方法
- 在SELECT语句的FROM子句中最多可以指定多少个表或视图,相互之间要用什么分隔,当所查询的表不在当前数据库时,可用什么格式来指出表或视图对象?
- 如果不写Order By子句,会怎么样
- PRB:在 SQL Server 中使用 COMPUTE BY 子句时出现“COMPUTE BY Statements Not Supported”(不支持 COMPUTE BY 语句)异常