0

我有以下 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

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

请建议我

谢谢

4

3 回答 3

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

于 2013-08-21T05:15:43.897 回答
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 次单独的传递,即将内部查询具体化到临时表中,然后对临时表执行另一次扫描以执行过滤,请向您的供应商发送一封愤怒的电子邮件或只是获得不同的产品。:)

于 2013-08-21T05:36:40.543 回答
0

查询优化器决定执行查询的最有效方式。它知道表中有多少行。我还建议Include Actual Execution Plan在 SQL Server Enterprise Manager 中使用该功能并检查订单。

于 2013-08-21T05:09:22.307 回答