日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

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

發(fā)布時間:2025/3/15 数据库 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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)容還不錯,歡迎將生活随笔推薦給好友。