我有以下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
当我执行上述语句时,哪一个将首先执行子查询或主查询?
请建议我
感谢
答案 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
包含 RowNo
,Name
,Address
答案 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个单独的传递,即将内部查询具体化为临时表,然后对临时表执行另一次扫描以执行过滤,请向您的供应商发送愤怒的电子邮件或者获取不同的产品。 :)