SQL SERVER 2005新增了APPLY运算符。该运算符有些类似于表连接(JOIN),但是功能却有不同。APPLY的右表表达式可以引用左输入中的列。在JOIN运算的时候,连接的2个表之间没有优先级,但是使用APPLY时,就像先计算左表输入,然后为左输入中的每一行计算一次右输入。
????APPLY分为CROSS APPLY和OUTER APPLY。CROSS APPLY的外部(左)行应用内部(右)表表达式时返回空集,则不返回该行,这个有点类似于INNER JOIN。而OUTER APPLY将返回该行,并且该行的内表表达式的属性是NULL,类似于OUTER JOIN。
????例如以下的代码是查询每个客户最新的2个订单。运用了CROSS APPLY运算符,在右部的计算中可以使用左部计算的结果,但是APPLY需要最终取个别名(CA),这点很让人困惑,也许是SQL SERVER内部解析器的需要。
????SELECT C.customerid,city,orderid ????FROM dbo.Customers AS C ???????CROSS APPLY ????????(SELECT TOP(2) orderid,?customerid ?????????FROM dbo.Orders AS O ?????????WHERE O.customerid?= C.customerid ?????????ORDER BY orderid DESC) AS CA;
????以上查询的结果如下:
????customerid??????????????????city????????????????????orderid
????Gerrard?????????????????????????Liverpool??????????????????2
????Gerrard?????????????????????????Liverpool??????????????????1
????Suarez??????????????????????????Liverpool??????????????????5
????Suarez??????????????????????????Liverpool??????????????????4
????Casillas ???????????????????????Madrid?????????????????????6????
?
????在以上的查询中,如果客户Carragher没有订单,则不会出现Carragher的记录,因为使用的是CROSS APPLY。如果想返回没有订单的客户,需要使用OUTER APPLY。
????查询的结果如下:
????customerid??????????????????city????????????????????orderid
????Carragher???????????????????????Liverpool??????????????????NULL
????Casillas ???????????????????????Madrid?????????????????????6????
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|