join是否会改变原始表的排序?

时间:2011-03-31 15:10:20

标签: sql-server sql-server-2005

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

例如

SELECT * FROM #empScheduled   

AND

    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 

将生成相同的记录但是在不同的排序顺序中!为什么会发生这种情况,以什么方式停止它并以与原始表相同的排序顺序生成结果而不必使用Order by?感谢。

3 个答案:

答案 0 :(得分:5)

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

希望结果“与原始表格的顺序相同”绝不是一个好主意,因为这不是订单的定义。如果要保留插入顺序,请使用升序主键,然后按顺序排序。这样,您始终可以恢复元组的“原始”顺序。

答案 1 :(得分:3)

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

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

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

答案 2 :(得分:0)

您可以尝试FORCE ORDER提示明确强制加入顺序。否则,优化器可以按照它认为最好的方式对连接进行排序。不知道为什么你不能使用ORDER BY