Sql server join是否会更改原始表的排序?

Sql server join是否会更改原始表的排序?,sql-server,sql-server-2005,Sql Server,Sql Server 2005,join是否会更改原始表的排序 比如说 SELECT * FROM #empScheduled 及 将生成相同的记录,但排序顺序不同!为什么会发生这种情况?有什么方法可以阻止它并以与原始表相同的排序顺序生成结果,而不必使用order by?谢谢。SQL Server中没有固有的排序顺序。 在您的情况下,这可能是由于联接表上的索引及其排序顺序造成的 如果您想要一致的排序结果,必须使用ORDER BY子句。您可以尝试强制顺序提示显式强制联接顺序。否则,优化器可以按其认为最好的方式对联接进行排

join是否会更改原始表的排序

比如说

SELECT * FROM #empScheduled   

将生成相同的记录,但排序顺序不同!为什么会发生这种情况?有什么方法可以阻止它并以与原始表相同的排序顺序生成结果,而不必使用order by?谢谢。

SQL Server中没有固有的排序顺序。

在您的情况下,这可能是由于联接表上的索引及其排序顺序造成的


如果您想要一致的排序结果,必须使用
ORDER BY
子句。

您可以尝试
强制顺序
提示显式强制联接顺序。否则,优化器可以按其认为最好的方式对联接进行排序。但不确定为什么不能使用排序依据。

如果不指定排序依据,则结果元组上没有已定义的顺序。一个简单的
SELECT*FROM x
将按照元组的存储顺序返回元组,因为只进行了表扫描。但是,如果执行了联接或类似操作,则无法知道中间结果是如何处理的,并且结果的顺序是未定义的


希望结果“与原始表的顺序相同”从来都不是一个好主意,因为这不是顺序的定义。如果要保留插入顺序,请使用升序主键并按该主键进行排序。这样,您就可以始终恢复元组的“原始”顺序。

解释得很好。谢谢。“一个简单的SELECT*FROM x将按照元组的存储顺序返回元组,因为只进行了表扫描”不一定是真的。即使是select*from mytable也不会有保证的订单。我不能使用order by,因为临时表中没有标识列。尽管如此,你能解释一下如何使用武力命令吗?谢谢。是的,不用管强制命令了。在执行多个联接时,您需要强制优化器进入联接顺序。由于SQL(集合)中的关系被定义为对其元组(行)没有顺序,因此即使调用强制顺序,这些行也会无序返回。您只需强制优化器首先连接某个表(基于查询中的连接顺序)。@user503510,因此,如果您想将标识定义用于排序顺序,请向临时表添加标识定义。非常感谢。即使没有“默认排序顺序”,只进行了表扫描,数据库在联接之后也不会完全以相同的方式进行扫描。我是否应该假设,如果联接的表没有索引,它将以与原始表相同的排序顺序显示结果?@user-永远不要假设输出的顺序相同,除非使用
order BY
子句。这在很大程度上取决于可能会发生变化的事情,如执行计划和使用的幕后联接,如果您的表上的统计信息随着时间的推移而发生变化,这些都会发生变化。@user503510,在任何情况下,您都不能假定排序顺序,而不定义排序依据。即使没有按照记录的输入顺序或聚集索引的顺序进行连接,它也不会返回数据。您不能依赖某种隐含的排序顺序。
    SELECT es.job_code,es.shift_id, es.unit_id,jd.job_description,s.shift_description,u.unit_code,
     [group] = (SELECT job_description FROM dbo.job_desc WHERE job_code = jd.job_group_with),es.new_group 
     FROM #empScheduled es JOIN job_desc jd ON es.job_code = jd.job_code 
JOIN dbo.shifts s ON es.shift_id = s.shift_id JOIN dbo.units u 
ON es.unit_id = u.unit_id