首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

求帮,select 执行语句的 逻辑执行顺序解决思路

2014-01-15 
求帮,select 执行语句的 逻辑执行顺序create table a (name nvarchar(10),course varchar(10))insert into

求帮,select 执行语句的 逻辑执行顺序
create table a (name nvarchar(10),course varchar(10))
insert into a values(N'张三', '12')
insert into a values(N'张三', '111') 
insert into a values(N'张三', '222')
insert into a values(N'李四', '111') go  


表a 
name       course
---------- ----------
张三         111
张三         222
李四         111
张三         12

执行语句:


SELECT     name, course,
                          (SELECT     COUNT(1) AS Expr1
                            FROM          a
                            WHERE      (name = t.name) AND (course < t.course)  ) + 1 AS px
FROM         a AS t

结果:name       course     px
---------- ---------- -----------
张三         111        1
张三         222        3
李四         111        1
张三         12         2




[解决办法]
首先是from a as t也就是最后一句,得出一个虚拟表假设名字为V1,这个表不能在查询过程中查到,第二步是内层FROM A这个,然后进行WHERE条件筛选,第三步把筛选数据和外层的FROM A AS T进行关联,得到一个结果,第四部进行COUNT操作,最后一步返回SELECT 的结果
[解决办法]
或者你用文本化执行计划看过程,从最内层开始,逐步向外执行

create table a (name nvarchar(10),course varchar(10))
insert into a values(N'张三', '12')
insert into a values(N'张三', '111') 
insert into a values(N'张三', '222')
insert into a values(N'李四', '111')  


SET STATISTICS PROFILE ON 
SELECT  name ,
        course ,
        ( SELECT    COUNT(1) AS Expr1
          FROM      a
          WHERE     ( name = t.name )
                    AND ( course < t.course )
        ) + 1 AS px
FROM    a AS T

/*
Rows                 Executes             StmtText                                                                                                                                                                                                                   StmtId      NodeId      Parent      PhysicalOp                     LogicalOp                      Argument                                                                                                                                                                            DefinedValues                                  EstimateRows  EstimateIO    EstimateCPU   AvgRowSize  TotalSubtreeCost OutputList                            Warnings Type                                                             Parallel EstimateExecutions


-------------------- -------------------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ----------- ----------- ----------- ------------------------------ ------------------------------ ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ---------------------------------------------- ------------- ------------- ------------- ----------- ---------------- ------------------------------------- -------- ---------------------------------------------------------------- -------- ------------------
4                    1                    SELECT  name ,
        course ,
        ( SELECT    COUNT(1) AS Expr1
          FROM      a
          WHERE     ( name = t.name )
                    AND ( course < t.course )
        ) + 1 AS px
FROM    a AS T  1           1           0           NULL                           NULL                           NULL                                                                                                                                                                                NULL                                           4             NULL          NULL          NULL        0.0068571        NULL                                  NULL     SELECT                                                           0        NULL
0                    0                      
[解决办法]
--Compute Scalar(DEFINE:([Expr1009]=[Expr1007]+(1)))                                                                                                                                                                    1           2           1           Compute Scalar                 Compute Scalar                 DEFINE:([Expr1009]=[Expr1007]+(1))                                                                                                                                                  [Expr1009]=[Expr1007]+(1)                      4             0             4E-07         23          0.0068571        [T].[name], [T].[course], [Expr1009]  NULL     PLAN_ROW                                                         0        1


4                    1                           
[解决办法]
--Nested Loops(Inner Join, OUTER REFERENCES:([T].[name], [T].[course]))                                                                                                                                            1           3           2           Nested Loops                   Inner Join                     OUTER REFERENCES:([T].[name], [T].[course])                                                                                                                                         NULL                                           4             0             1.672E-05     23          0.0068567        [T].[name], [T].[course], [Expr1007]  NULL     PLAN_ROW                                                         0        1
4                    1                                
[解决办法]
--Table Scan(OBJECT:([tempdb].[dbo].[a] AS [T]))                                                                                                                                                              1           4           3           Table Scan                     Table Scan                     OBJECT:([tempdb].[dbo].[a] AS [T])                                                                                                                                                  [T].[name], [T].[course]                       4             0.003125      0.0001614     19          0.0032864        [T].[name], [T].[course]              NULL     PLAN_ROW                                                         0        1


0                    0                                
[解决办法]
--Compute Scalar(DEFINE:([Expr1007]=CONVERT_IMPLICIT(int,[Expr1012],0)))                                                                                                                                      1           5           3           Compute Scalar                 Compute Scalar                 DEFINE:([Expr1007]=CONVERT_IMPLICIT(int,[Expr1012],0))                                                                                                                              [Expr1007]=CONVERT_IMPLICIT(int,[Expr1012],0)  1             0             1.1E-06       11          0.00355358       [Expr1007]                            NULL     PLAN_ROW                                                         0        4
4                    4                                     
[解决办法]
--Stream Aggregate(DEFINE:([Expr1012]=Count(*)))                                                                                                                                                         1           6           5           Stream Aggregate               Aggregate                      NULL                                                                                                                                                                                [Expr1012]=Count(*)                            1             0             1.1E-06       11          0.00355358       [Expr1012]                            NULL     PLAN_ROW                                                         0        4


3                    4                                          
[解决办法]
--Table Scan(OBJECT:([tempdb].[dbo].[a]), WHERE:([tempdb].[dbo].[a].[name]=[tempdb].[dbo].[a].[name] as [T].[name] AND [tempdb].[dbo].[a].[course]<[tempdb].[dbo].[a].[course] as [T].[course]))    1           7           6           Table Scan                     Table Scan                     OBJECT:([tempdb].[dbo].[a]), WHERE:([tempdb].[dbo].[a].[name]=[tempdb].[dbo].[a].[name] as [T].[name] AND [tempdb].[dbo].[a].[course]<[tempdb].[dbo].[a].[course] as [T].[course])  NULL                                           1             0.0032035     8.29E-05      19          0.0035351        NULL                                  NULL     PLAN_ROW                                                         0        4

*/


[解决办法]
SELECT     name, course,
                          (SELECT     COUNT(1) AS Expr1
                            FROM          a
                            WHERE      (name = t.name) AND (course < t.course)  ) + 1 AS px
FROM         a AS t

这个语句的执行顺序就是:

1.从a表中取出1条数据,然后这样就有了字段name,course字段的值

2.然后把name字段和course字段的值,传入到子查询中,过滤子查询中的a表的数据,count(1)就是计算条数

3.把计算出来的条数expr1 的值,加1,最后也就是px

4.回到第一步,继续从a中,取出下一条数据。
[解决办法]
sql语句的执行顺序是:
?FROM
?WHERE
?GROUP BY
?HAVING
?SELECT
?DISTINCT
?UNION
?ORDER BY

[解决办法]
其实按照我的理解应该是同时执行括号内和括号外的,因为两个查询需要关联

热点排行