Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如果未定义ORDERBY子句,则distinct select中的第一列是默认顺序_Sql Server_Tsql_Distinct - Fatal编程技术网

Sql server 如果未定义ORDERBY子句,则distinct select中的第一列是默认顺序

Sql server 如果未定义ORDERBY子句,则distinct select中的第一列是默认顺序,sql-server,tsql,distinct,Sql Server,Tsql,Distinct,在工作时,我只是在选择列表的第一列和第二列中记录了SQL Server的顺序,当它具有不同的并且不是按照随机顺序或按顺序创建记录时 任何人都可以确认自己的经验吗?如果Distinct Sort运算符是查询执行计划中的最后一个运算符,那么似乎可以合理地假设最终顺序是按顺序排列的列。然而,如果你真的希望他们以某种方式被订购,你不应该依赖这个假设。您应该显式地添加一个orderby子句。冒着事情不顺利的风险,冒着可能获得的微小性能提升是不值得的。还有其他操作符可以确保清晰性,例如聚合。你确定会有结果吗

在工作时,我只是在选择列表的第一列和第二列中记录了SQL Server的顺序,当它具有不同的并且不是按照随机顺序或按顺序创建记录时


任何人都可以确认自己的经验吗?

如果
Distinct Sort
运算符是查询执行计划中的最后一个运算符,那么似乎可以合理地假设最终顺序是按顺序排列的列。然而,如果你真的希望他们以某种方式被订购,你不应该依赖这个假设。您应该显式地添加一个
orderby
子句。冒着事情不顺利的风险,冒着可能获得的微小性能提升是不值得的。还有其他操作符可以确保清晰性,例如聚合。你确定会有结果吗

嘿,如果引擎变得足够智能,可以确定返回的行已经是不同的,并且不需要做任何进一步的操作(例如排序或任何类型的聚合或其他流来丢弃重复的行),该怎么办?这可能相当容易,具体取决于是否包含基础表中的主键列或唯一列(全部)。例如,如果您在
OrderID
上有一个聚集索引,那么任何包含
OrderID
且不可能重复该值的查询都可以证明是不同的

依赖某些手术的副作用是一个坏习惯。想想视图:很长一段时间以来,你被允许在一个视图中按下订单,而且它是有效的,尽管它本不应该被依赖。然后,人们升级了SQL Server数据库,发现原来的行为不再受支持。我使用的是一个SQL 2000数据库,在升级到SQL 2005并更改兼容模式后,前端的几个数据表不再进行排序--哎呀

再想想并行性——这会将任务分解成更小的部分。在某些情况下,在某些版本的SQL Server中,并行性已经被证明破坏了
Scope\u Identity()
。如果一个工作线程在另一个工作线程之前完成,那么它的结果可能会在其他线程完成之前流式传输到客户端,从而突然改变顺序


把它做好。添加一个订购人。不要再猜测会发生什么、可能发生什么、应该发生什么。或者什么不会、不能或不应该。

使用DISTINCT检查查询的执行计划可以确认您的观察。

简而言之,您可以依赖以特定顺序返回的记录的唯一方法是使用
order BY
子句。不要以为没有这个,他们会以任何特定的顺序回来。如果您查看查询计划(CTRL-L),您可能会在其中看到一个
顺序,SQL Server使用它来传递
DISTINCT
,但是查询计划可以在执行查询之间更改,将来可能不会这样。散列聚合也可以用于DISTINCT,因此您可能看不到排序。随着行数的增加,它们更有可能显示出来。此外,随着行数的增加,您的计划可能会并行,这也可能会改变顺序。