SQL Server 2005中新的逻辑处理阶段

      SQL Server 2005支持4种用于from子句的表运算符:join、apply、pivot和unpivot。

      表运算符用一个或两个表作为输入。根据它们相对于表运算符关键字的位置,它们被称为左输入和右输入。与联接一样,所有表运算符都会用虚拟表作为它们的左输入,位于from子句的第一个表运算符用一个表表达式作为左输入并返回一个虚拟表作为结果。表表达式可以表示许多对象:真实的表、临时表、表变量、派生表、共用表达式、视图、表值函数。

      下面是这4个表运算符及其元素:

View Code
 1 --------------Join--------
2 <left_table_expression>
3 <join_type> join <right_table_expression>
4 on <join_condition>
5
6 -------------Apply----------
7 <left_table_expression>
8 {cross|outer} apply <right_table_expression>
9
10 -------------Pivot----------
11 <left_table_expression>
12 pivot (<aggregate_func(<expression>)>)
13 for
14 <source_col> in(<target_col_list>)
15 as <result_table_alias>
16
17 ------------Unpivot----------
18 <left_table_expression>
19 unpivot (<target_values_col>)
20 for
21 <target_names_col> in(<source_col_list>)
22 as <result_table_alias>

 

      Join涉及下列步骤的子集 (取决于Join的类型 ) :J1:交叉联接左输入和右输入;J2:应用on子句;J3:添加外部行。

      Apply涉及两个步骤的子集 (取决于Apply的类型 ):A1:把右表表达式应用到左表输入的行;A2:添加外部行。PS:cross apply和outer apply总是包含A1,只有outer apply包含A2.

      Pivot运算符用于把数据从多行的分组状态旋转为每一组位于一行的多列状态,并在该过程中执行聚合运算。Pivot运算符包含了三个逻辑阶段:P1:隐式分组;P2:隔离值;P3:应用聚合函数。

      Pivot的隐式分组阶段并不替换查询中显式的group by子句,pivot最终会生成一个虚拟表,并作为下一个逻辑阶段的输入,也许是另一个表的操作也许是where阶段。

      Pivot的第二个阶段隔离目标列对应的值,逻辑上,它为in子句中的每个目标列使用下面的case表达式:

case when <source_col> = <target_col_element> then <expression> end

PS:不带else子句的case表达式包含一个隐含的else null。

        Pivot的第三个阶段对每个case表达式应用指定的聚合函数,并生成结果列。

        Unpivot与Pivot相反,它把数据从一行中的多个列值旋转为多行,每一行包含一个源列的值。

        Unpivot操作涉及三个逻辑处理阶段:U1:生成副本;U2:隔离目标列值;U3:过滤带有null的行。

        Over子句:允许你请求基于窗口的计算,该子句是聚合函数的新选项,同时也是四个新排名函数 (ROW_NUMBER、RANK、DENSE_RANK、NTILE) 的必选项。如果指定了over子句,它的输入将代替查询的group by列表,用于在聚合或排名函数进行计算时所基于的分区和排序。

         只有两个阶段可以应用over子句:select阶段和order by阶段,该子句可以访问作为这两个阶段输入的任意表。

        集合操作:

        SQL Server 2005 支持三种集合操作:UNION、EXCEPT、INTERSECT。

        语法:

View Code
[(]left_query[)]{union [all]|except|intersect}[(]right_query[)]
[order by <order_by_list>]

 

        集合操作在两个输入中比较全部行,union返回包含两个输入中所有行的结果集,如果未指定all选项,union将从结果中移除重复行。except返回出现在左输入但未出现在右输入的不重复行。intersect返回在两个输入中都出现过的不重复行。

        Order by子句不能用于集合操作的单个查询中,你只能在查询的最后指定order by子句,但它将被应用于集合操作的结果。

        在逻辑处理方面,每个输入查询先按各自的步骤被分别处理。然后,再应用集合操作,如果指定了order by子句,再把它应用到结果集。

        集合操作中的两个null值是被认为相等的!

 

posted on 2012-02-03 14:54  Jeallyn  阅读(425)  评论(0编辑  收藏  举报