【问题标题】:Outer Query OrderBy does not depends on Inner Query's Resultset外部查询 OrderBy 不依赖于内部查询的结果集
【发布时间】:2013-04-29 06:52:06
【问题描述】:

我对 SQL 执行顺序没有深入了解。

当我执行查询时

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 的 order by 会影响 Inner Query 的整个表。

请评论我犯错的地方。

【问题讨论】:

  • 您使用哪种 DBMS?我正在使用 SQL Server,结果符合预期 ABC2,200,Data002 后跟 ABC1,100,Data001
  • @Mithrandir - 不。我在 SQL Server 中没有得到预期的结果。
  • 我使用的是 SQL Server 2008。
  • 嗨,Roms,非常好的问题,许多数据库专家总是误以为是这个问题。请参考我的回答,它会对你有所帮助。

标签: sql sql-server-2008 select sql-order-by


【解决方案1】:

默认情况下,SQL Server 没有任何意义来填充 order by。 在您的内部查询中,您没有指定 order by,因此它返回了错误的结果。 现在为 SQL Server 2008 R2 使用以下代码

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

另一种选择是:命令表表达式,如下所示,

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

【讨论】:

  • 谢谢大家的回答。但我不会将其标记为已接受,因为我想知道 SQL 以这种方式操纵执行的原因。而且您还提到“SQL Server 没有任何意义来填充默认排序依据”,它具有默认的升序“排序依据”。例如。 select top 2 T.* from ( select 'Data5' as c1 union select 'Data3' union select 'Data4' union select 'Data2' union select 'Data1' union select 'Data6' ) T 会给出 c1 -----数据1 数据2
  • Roms,SQL 将根据良好的性能路径处理查询,我同意你的观点,默认情况下 order by 子句是升序,但 SQL 将决定它应该应用于哪一列。 SQL Server 多次在不同的环境中返回不同的结果,它会自动检查执行的良好路径,所以如果你想按升序选择前 2 个数据库,那么你必须指定否则它将基于良好的执行路径,所以现在这个答案是接受吧?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-05
  • 2023-03-24
  • 1970-01-01
  • 1970-01-01
  • 2020-05-19
相关资源
最近更新 更多