2013-04-29 85 views
3

我对SQL执行顺序没有深入的了解。外部查询OrderBy不取决于内部查询的结果集

当我执行查询

select top 2 * from Configuration 

它给了我

ABC1,100,Data001  
ABC2,200,Data002 

当我执行查询

select top 2 * from Configuration order by 1 desc 

它给了我

XYZ1,400,Data100  
XYZ2,300,Data099 

当我执行查询

select * from (select top 2 * from Configuration) as a order by 1 desc 

它给了我

XYZ1,400,Data100  
XYZ2,300,Data099 

我的问题是为什么我收到

XYZ1,400,Data100  
XYZ2,300,Data099 

作为代替输出

ABC1,100,Data001  
ABC2,200,Data002 

根据我的知识,内部查询将返回两行到外部查询。 外查询将处理这些两排,

From->Where->group by->having->Select->Order by 

序执行的,并给输出作为我提到如预期两行。但Outer Query的顺序影响着Inner Query的整个表格。

请评论我在哪里犯错。

+0

你使用哪种DBMS?我正在使用SQL Server,结果如预期的那样,ABC2,200,Data002由ABC1,100,Data001跟随。 – Mithrandir 2013-04-29 07:00:51

+0

@Mithrandir - 没有。我没有在SQL Server中获得预期的结果。 – hims056 2013-04-29 07:02:36

+0

我正在使用SQL Server 2008. – Romesh 2013-04-29 07:11:45

回答

4

SQL Server没有任何意义默认顺序填充。 在你的内部查询中你没有指定顺序,所以它返回了错误的结果。 现在使用下面的代码为SQL Server 2008 R2

SELECT * FROM (SELECT TOP 2 * FROM Configuration ORDER BY 1) AS a ORDER BY 1 DESC 

一个另一种方法是:Comman表表达式,如下面,

;WITH cteTest AS 
(
    SELECT TOP 2 * 
    FROM Configuration ORDER BY 1 
) 
SELECT * FROM cteTest ORDER BY 1 DESC 
+0

谢谢你的答复。 但我不会将它标记为Accepted,因为我想要SQL以这种方式操纵执行的原因。 而且你也提到“SQL Server没有任何意义可以通过默认顺序填充”, 它有默认的升序“order by”。 例如。 选择top 2 T.*从( 选择“DATA5”作为C1 工会 选择“数据3” 工会 选择“数据4” 工会 选择“数据2” 工会 选择“数据1” 工会 选择“DATA6”)笔 它会给 C1 ----- 数据1 数据2 – Romesh 2013-04-29 10:49:05

+0

ROM,SQL将处理良好的性能路径查询的基础上,我同意你的看法,在默认情况ORDER BY子句上升,但SQL将决定其上它列应该适用。 SQL Server多次在不同的环境下返回不同的结果,它会自动检查执行的好路径,所以如果你想按升序选择前两个数据库,那么你必须指定 ,否则它将基于良好的执行路径。答案被接受了吗? – Anvesh 2013-04-29 11:01:48