MS SQL Server 2005 APPLY 详解

SQL Server 2005 新增 cross apply 和 outer apply 联接语句,SQL Server 2000 中有个 cross join 是用于交叉联接的.

增加 cross apply 和 outer apply 是用于交叉联接表值函数(返回表结果集的函数)的,更重要的是这个函数的参数是另一个表中的字段。这个解释可能有些含混不请,请看下面的例子:

1. cross join 联接两个表 select * from TABLE_1 as T1 cross join TABLE_2 as T2    
2. cross join 联接表和表值函数,表值函数的参数是个“常量” select * from TABLE_1 T1 cross join FN_TableValue(100)    
3. cross join 联接表和表值函数,表值函数的参数是“表T1中的字段” select * from TABLE_1 T1 cross join FN_TableValue(T1.column_a) Msg 4104, Level 16, State 1, Line 1 The multi-part identifier "T1.column_a" could not be bound.    

最后的这个查询的语法有错误。在 cross join 时,表值函数的参数不能是表 T1 的字段,为啥不能这样做呢?我猜可能微软当时没有加这个功能:),后来有客户抱怨后,于是微软就增加了 cross apply 和 outer apply 来完善,请看 cross apply, outer apply 的例子:

4. cross apply select * from TABLE_1 T1 cross apply FN_TableValue(T1.column_a) -- 5. outer apply select * from TABLE_1 T1 outer apply FN_TableValue(T1.column_a)    

cross apply 和 outer apply 对于 T1 中的每一行都和派生表(表值函数根据T1当前行数据生成的动态结果集)做了一个交叉联接。cross apply 和 outer apply 的区别在于: 如果根据 T1 的某行数据生成的派生表为空,cross apply 后的结果集就不包含 T1 中的这行数据,而 outer apply 仍会包含这行数据,并且派生表的所有字段值都为 NULL。 

APPLY 运算符 使用 APPLY 运算符可以为实现查询操作的外部表表达式返回的每个行调用表值函数。表值函数作为右输入,外部表表达式作为左输入。通过对右输入求值来获得左输入每一行的计算结果,生成的行被组合起来作为最终输出。APPLY 运算符生成的列的列表是左输入中的列集,后跟右输入返回的列的列表。
注意:若要使用 APPLY,数据库兼容级别必须为 90。
APPLY 有两种形式:CROSS APPLY 和 OUTER APPLY。CROSS APPLY 仅返回外部表中通过表值函数生成结果集的行。OUTER APPLY 既返回生成结果集的行,也返回不生成结果集的行,其中表值函数生成的列中的值为 NULL。
语法: APPLY 操作符作用于 FROM 字句中,它的具体语法如下: FROM left_table_source   { CROSS | OUTER } APPLY right_table_source
在上面的语法中,left_table_source 表示坐输入;right_table_source 表示右输入,一般是表值函数,但亦可是视图、表、派生表。
1. CROSS APPLY 说明:只返回外部表中包含的数据行,这些航从表值函数中生成结果集。
2. OUTER APPLY 说明:无论联接是否存在,都会从外部表和表值函数中返回数据行。这与OUTER JOIN 很类似。如果表值函数中没有行存在,则从函数中返回的列值为NULL。
3. APPLY 与 JOIN 当 APPLY 操作符的右输入不是表函数时,它会表现出与 JOIN 类似的行为。

posted @ 2013-03-13 16:01  .net刚入门  阅读(217)  评论(0编辑  收藏  举报