T-SQL中APPLY应用事例解析

      一直都没研究过Apply的用法,最近浏览帖子,是不是会看到,顺便学习一下。

 

    MSDN:使用 APPLY 运算符可以为实现查询操作的外部表表达式返回的每个行调用表值函数。表值函数作为右输入,外部表表达式作为左输入。通过对右输入求值来获得左输入每一行的计算结果,生成的行被组合起来作为最终输出。APPLY 运算符生成的列的列表是左输入中的列集,后跟右输入返回的列的列表。

   

    没有接入过APPLY的,看到上面的话,肯定云里雾里。

    其实通俗的说,就是APPLY后面是表Table,这个表Table是由表值函数动态生成的。所谓表值函数就是自定义一个函数,返回值是Table。函数的参数为左表(左输入或者APPLY前面查询表)的某一字段。通过对左表的每行调用表值函数,生成临时表,所有的临时表Union组合成一个新表(右输入)。然后左表和右表Join到一起,就是所需的结果集。

    以下示例是获取教师所教授的学生信息:

 

    上面的(select * from Student s where s.tid=t.tid)tmp就是表值函数返回的表,用一下方式写出,大家可能更明白一些。


    从以上事例可以看书,三种写法的执行结果是相同的。

    但是,这并不意味着apply就等同于join。这只是简单的查询,如果右输入(右表)依赖左表,且经过复杂的运算才可以得到的话,用join就很难实现了,即使实现的话,可读性也会不太好,可能除了自己,别人很难解读。   如果利用apply  + 表值函数的方式就比较明了。具体的可以看MSDN中的事例:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值