微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

sqlserver技术内幕<二> 表运算符之apply

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。

ottom:5px; padding-top:0px; padding-bottom:0px; border:0px; list-style:none; word-wrap:normal; word-break:normal; line-height:21px; color:rgb(73,orderid
    FROM dbo.Customers AS C
       OUTER 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

    Carragher                       Liverpool                  NULL

    Casillas                        Madrid                     6    

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐