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

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

WBOY
WBOYOriginal
2016-06-07 15:33:261248Durchsuche

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    

 

 

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn