条件和子查询的地方

时间:2013-08-21 05:01:42

标签: sql

我有以下sql select语句: -

SELECT A.RowNo, A.Name, A.Address   
FROM (SELECT ROW_NUMBER() OVER(Order by Table1.ID)   
As RowNo, Table1.Name, Table1.Address From Table1) A
WHERE RowNo Between 1 And 10

当我执行上述语句时,哪一个将首先执行子查询或主查询?

请建议我

感谢

3 个答案:

答案 0 :(得分:0)

query optimizer决定执行查询的最有效方式。它知道表中有多少行。我还建议在SQL Server企业管理器中的Include Actual Execution Plan函数中检查订单。

答案 1 :(得分:0)

您的子查询将首先执行

SELECT ROW_NUMBER() OVER(Order by Table1.ID) As RowNo, Table1.Name, Table1.Address From Table1

以上查询是内联视图的示例,其中包含来自Table1的数据以及一些其他列,此视图可以称为A

所以,你最后的查询变成了

SELECT A.RowNo, A.Name, A.Address FROM A WHERE RowNo Between 1 And 10

其中A包含 RowNoNameAddress

答案 2 :(得分:0)

你的问题有点误导。您假设需要执行2个查询。在这种情况下,常识告诉您内部查询必须在外部查询之前执行。

然而,任何体面的查询优化器(你还没有指定你正在使用的产品和版本)应该能够推断出这实际上是单个查询,并且它只是SQL语言的愚蠢限制而不是允许你写:

SELECT ROW_NUMBER() OVER(Order by Table1.ID) As RowNo, Table1.Name, Table1.Address From Table1 WHERE RowNo Between 1 And 10

随意向ANSI表达您的挫败感(设置SQL标准)。如果您使用的优化器确实必须执行2个单独的传递,即将内部查询具体化为临时表,然后对临时表执行另一次扫描以执行过滤,请向您的供应商发送愤怒的电子邮件或者获取不同的产品。 :)