zoukankan      html  css  js  c++  java
  • SqlServer2005APPLY

    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。

        SELECT C.customerid, city, 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

        Gerrard                         Liverpool                  2

        Gerrard                         Liverpool                  1

        Suarez                          Liverpool                  5

        Suarez                          Liverpool                  4

        Casillas                        Madrid                     6    

        ----Steve

  • 相关阅读:
    react学习总结(一)
    jQuery的attr()与prop()的区别
    Vue.js学习(常用指令)
    Node.js学习(篇章一)
    CSS3关于-webkit-tap-highlight-color属性
    position布局影响点击事件以及冒泡获取事件目标
    取消事件默认行为(移动端)
    rem与px之间的换算(移动端)
    Node.js(初识)
    ES6(变量的解构赋值)
  • 原文地址:https://www.cnblogs.com/zqn518/p/2411413.html
Copyright © 2011-2022 走看看