您好,欢迎访问一九零五行业门户网

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

sql server 2005新增了apply运算符。该运算符有些类于表连接(join),但是功能却有不同。apply的右表表达式可以引用左输入中的列。在join运算的时候,连接的2个表之间没有优先级,但是使用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。
    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
其它类似信息

推荐信息