日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

SQL 关于apply的两种形式cross apply 和 outer apply(转)

發(fā)布時間:2025/3/15 50 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SQL 关于apply的两种形式cross apply 和 outer apply(转) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

轉(zhuǎn)載鏈接:http://www.cnblogs.com/shuangnet/archive/2013/04/02/2995798.html

apply有兩種形式: cross apply 和 outer apply

先看看語法:

  <left_table_expression>? {cross|outer} apply <right_table_expression>

再讓我們了解一下apply運算涉及的兩個步驟:

  • A1:把右表表達式(<right_table_expression>)應(yīng)用到左表(<left_table_expression>)輸入的行;
  • A2:添加外部行;
  •   使用apply就像是先計算左輸入,讓后為左輸入中的每一行計算一次右輸入。(這一句很重要,可能會不理解,但要先記住,后面會有詳細的說明

    最后結(jié)合以上兩個步驟說明cross apply和outer apply的區(qū)別:

      cross apply和outer apply 總是包含步驟A1,只有outer apply包含步驟A2,如果cross apply左行應(yīng)用右表表達式時返回空積,則不返回該行。而outer apply返回改行,并且改行的右表表達式的屬性為null。

    看到上面的解釋或步驟大家可能還是一頭的霧水,不知所云。下面用例子來說明:

    先建表一([dbo].[Customers]? 字段說明:customerid -- 消費者id?, city -- 所在城市):

    ?

    CREATE TABLE [dbo].[Customers]([customerid] [char](5) COLLATE Chinese_PRC_CI_AS NOT NULL,[city] [varchar](10) COLLATE Chinese_PRC_CI_AS NOT NULL, PRIMARY KEY CLUSTERED ([customerid] ASC )WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY] ) ON [PRIMARY]

    ?

    向表一插入數(shù)據(jù):

    insert into dbo.Customers values('FISSA','Madrid'); insert into dbo.Customers values('FRNDO','Madrid'); insert into dbo.Customers values('KRLOS','Madrid'); insert into dbo.Customers values('MRPHS','Zion');

    查詢所插入的數(shù)據(jù):

    select * from dbo.Customers

    結(jié)果如圖:

    再建表二([dbo].[Orders]? 字段說明:orderid -- 訂單id? , customerid -- 消費者id):

    CREATE TABLE [dbo].[Orders]([orderid] [int] NOT NULL,[customerid] [char](5) COLLATE Chinese_PRC_CI_AS NULL, PRIMARY KEY CLUSTERED ([orderid] ASC )WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY] ) ON [PRIMARY]

    向表二插入數(shù)據(jù):

    insert into dbo.Orders values(1,'FRNDO'); insert into dbo.Orders values(2,'FRNDO'); insert into dbo.Orders values(3,'KRLOS'); insert into dbo.Orders values(4,'KRLOS'); insert into dbo.Orders values(5,'KRLOS'); insert into dbo.Orders values(6,'MRPHS'); insert into dbo.Orders values(7,null);

    查詢插入的數(shù)據(jù):

    select * from dbo.orders

    結(jié)果如圖:

    例子:題目:得到每個消費者最新的兩個訂單:

    用cross apply

    sql:

    select * from dbo.Customers as Ccross apply(select top 2 *from dbo.Orders as Owhere C.customerid=O.customeridorder by orderid desc) as CA

    結(jié)果如圖:

    過程分析:

      它是先得出左表【dbo.Customers】里的數(shù)據(jù),然后把此數(shù)據(jù)一條一條的放入右表表式中,分別得出結(jié)果集,最后把結(jié)果集整合到一起就是最終的返回結(jié)果集了(T1的數(shù)據(jù) 像for循環(huán)一樣 一條一條的進入到T2中 然后返回一個集合? 最后把所有的集合整合到一塊? 就是最終的結(jié)果),最后我們再理解一下上面讓記著的話(使用apply就像是先計算左輸入,讓后為左輸入中的每一行計算一次右輸入)是不是有所明白了。

    實驗:用outer apply 試試看看的到的結(jié)果:

    sql語句:

    select * from dbo.Customers as Couter apply(select top 2 *from dbo.Orders as Owhere C.customerid=O.customeridorder by orderid desc) as CA

    結(jié)果如圖:

    結(jié)果分析:

      發(fā)現(xiàn)outer apply得到的結(jié)果比cross多了一行,我們結(jié)合上面所寫的區(qū)別(cross apply和outer apply 總是包含步驟A1,只有outer apply包含步驟A2,如果cross apply左行應(yīng)用右表表達式時返回空積,則不返回該行。而outer apply返回改行,并且改行的右表表達式的屬性為null)就會知道了。

    轉(zhuǎn)載于:https://www.cnblogs.com/yxlblogs/p/4877248.html

    總結(jié)

    以上是生活随笔為你收集整理的SQL 关于apply的两种形式cross apply 和 outer apply(转)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。