IT技術互動交流平台

SQL Server聚焦APPLY運算符(二十七)

作者|_|诺基亚3208c游戏:JeffckyWang  來源|-_易发大吉大利下载:IT165收集  發布日期_|永盛彩票wwwys36com:2016-12-19 20:32:17

前言

其實有些新的特性在SQL Server早就已經出現過-_|亿彩网安卓版,但是若非係統的去學習數據庫你會發現在實際項目中別人的SQL其實是比較複雜的-||厚皮哪里多,其實利用新的SQL Server語法會更加方便和簡潔-|至尊争霸彩票能赚钱吗,從本節開始我們將講述一些SQL Server中早已出現的新語法-__花语梦,簡短的內容--_淘宝开店,深入的理解-_国际刑警电影,Always to reivew the basics|-|22选5河南走势图百度。

初探APPLY運算符

APPLY運算符是一個非常強大的表運算符_-氨糖的功效橄固力,但是APPLY不是標準的-|亿乐彩注册登录,相對應的標準叫做LATERAL_|dsound.dll病毒,但是此標準並未在SQL Server中實現|_大连大商新玛特招聘。像所有表運算符一樣_注册送28元体验金彩票,該運算符用於查詢的FROM子句中|湘湖二期。APPLY運算符支持的類型是CROSS APPLY和OUTER APPLY|_重庆言子下载。CROSS APPY僅僅實施一個邏輯查詢處理階段_|湖南电视台电视剧,而OUTER APPLY實施了兩個階段_|_诛仙飞升任务流程,APPLY運算符對兩個輸入表進行操作-01彩票597849com,第二個可以是一個表表達式-_-盈彩在线大发快3,我們將APPLY兩側的表分別叫做左側表和右側表|-诺基亚5320xm软件下载,右側表通常是一個派生表或TVF(內嵌表值函數)-_|2019王中王论坛资料。CROSS APPLY運算符實施一個邏輯查詢處理階段-它將右側的表表達式應用到左側表的每一行--搜搜返利网,並生成一個組合結果集的結果表-_|小班下学期班务总结。CROSS APPLYl類似於交叉聯接中的CROSS JOIN_-_高三毕业赠言,但是使用CROSS APPLY運算符-198彩票怎么样,右側的表表達式可以對來自左側表的每一行表示一個不同的行集|-_深职院校内网,這是與聯接的不同之處-_-盈彩在线是哪个网址。當在右側使用一個派生表|-|永盛国际彩票骗局,並且派生表查詢中引用來自左側表的屬性||-康鸥移动电源怎么样,就可以實現此目標-||2628彩票账号注册,或者是在右側使用一個內嵌TVF_长沙友谊商店招聘,可以傳遞左側的屬性作為輸入參數--易赢在线官网,同樣可以實現此目的-摘抄自SQL Server 2012基礎教程_|-英国梧桐。下麵我們看一個簡單的例子__九纵新一团。

USE TSQL2012
GO

SELECT C.custid, A.orderid, A.orderdate
FROM Sales.Customers AS C
    CROSS APPLY
        (SELECT TOP(3) orderid, empid, orderdate, requireddate 
        FROM Sales.Orders AS O
        WHERE O.custid = C.custid
        ORDER BY orderdate DESC, orderid DESC) AS A;

上述完成的是返回每個客戶最近的3個訂單_-autocad2004下载。我們可以將右側的表表達式看做是一個相關子查詢-|-2m永久免费全年记资料,右側的表表達式通過引用custid對來自Customers表的每一行進行處理並返回每個客戶的最近的3個訂單_|众发彩票代打兼职,是不是看起來很清爽呢_-_金铃子种植,下麵我們將進一步探討APPLY運算符的作用|||静水天平。

進一步探討APPLY運算符

上麵我們看到通過相關子查詢來進行查詢顯得代碼有點醜陋-_餐具修复,我們再來看一個例子_|147期香港预测。查詢每個單價最高的訂單_-|3u8705,我們通過子查詢來實現_|盈彩在线下载。

CROSS APPLY

USE AdventureWorks2012
GO

SELECT 
     SalesOrderID
    ,OrderDate
    ,MaxUnitPrice =(SELECT MAX(sod.UnitPrice) FROM Sales.SalesOrderDetail sod WHERE soh.SalesOrderID = sod.SalesOrderID)
FROM Sales.SalesOrderHeader AS soh

如上操作看似代碼比較簡潔也能完成我們的查詢訴求-_qq空间克隆下载,但是我們用派生表來進行查詢又是怎樣的呢--英菲迪尼qx56? 

USE AdventureWorks2012
GO

SELECT 
    soh.SalesOrderID
    ,soh.OrderDate
    ,sod.max_unit_price
FROM Sales.SalesOrderHeader AS soh
JOIN
(
    SELECT 
        max_unit_price = MAX(sod.UnitPrice),
        SalesOrderID
    FROM Sales.SalesOrderDetail AS sod
    GROUP BY sod.SalesOrderID
) sod
ON sod.SalesOrderID = soh.SalesOrderID

此時由於兩個表完全不相關|-_苯乙烯用途,我們需要通過GROUP BY完成再進行JOIN--南滨是哪个省的,代碼不是顯得非常臃腫嗎---雷霆扫毒蒙面人是谁,這還是簡單的__戴拿奥特曼国语全集,當有多個表時就比較複雜了-_众益彩票这软件可靠吗?,導致代碼就不再具有可讀性-优彩彩票是不是违法的。但是自從在SQL Server 2005中有了APPLY媽媽再也不用擔心我讀不懂複雜的代碼了__魔泥官网,我們看看CROSS APPLY是怎樣實現的__幼儿教师年度工作总结。

USE AdventureWorks2012
GO

SELECT 
    soh.SalesOrderID
    ,soh.OrderDate
    ,sod.max_unit_price
FROM Sales.SalesOrderHeader AS soh
CROSS APPLY
(
    SELECT 
        max_unit_price = MAX(sod.UnitPrice)
    FROM Sales.SalesOrderDetail AS sod
    WHERE soh.SalesOrderID = sod.SalesOrderID
) sod

當我們利用內部聯接時此時JOIN中的查詢是獨立的所以需要進行GROUP BY--_pptv湖南卫视,而對於CROSS APPLY它本身就是對來自左側的表中每一行就行處理並返回|-英皇国际版本363,同時利用CROSS APPLY它也超越了相關子查詢__qq2009下载,比如說我們還需要查出每個訂單的總價呢-_|诺基亚n79手机,我們利用相關子查詢需要再次嵌入SELECT子句||-仲博最新版官方下载。

SELECT 
     SalesOrderID           
    ,OrderDate              
    ,MaxUnitPrice           = (SELECT MAX(sod.UnitPrice) FROM Sales.SalesOrderDetail sod WHERE soh.SalesOrderID = sod.SalesOrderID)
    ,SumLineTotal           = (SELECT SUM(LineTotal) FROM Sales.SalesOrderDetail sod WHERE soh.SalesOrderID = sod.SalesOrderID)
FROM Sales.SalesOrderHeader AS soh

而利用CROSS APPLY隻需添加集合函數SUM即可

USE AdventureWorks2012
GO

SELECT 
    soh.SalesOrderID
    ,soh.OrderDate
    ,sod.max_unit_price
    ,sod.sum_line_total
FROM Sales.SalesOrderHeader AS soh
CROSS APPLY
(
    SELECT 
        max_unit_price = MAX(sod.UnitPrice)
        ,sum_line_total = SUM(sod.LineTotal)
    FROM Sales.SalesOrderDetail AS sod
    WHERE soh.SalesOrderID = sod.SalesOrderID
) sod 

OUTER APPLY

對於OUTER APPLY|_众发国际是干什么的,如果右側的表表達式返回一個空集合|虚拟社区游戏,CROSS APPLY運算符不會返回相應的左側行__nokia翻盖手机,也就是說OUTER APPLY和在派生表上進行LEFT JOIN是等同的-||海鑫钢材信息网,如下_--湖南移动梦网:

SELECT 
    soh.SalesOrderID
    ,soh.OrderDate
    ,sod.max_unit_price
FROM Sales.SalesOrderHeader AS soh
LEFT JOIN
(
    SELECT 
        max_unit_price = MAX(sod.UnitPrice),
        SalesOrderID
    FROM Sales.SalesOrderDetail AS sod
    GROUP BY sod.SalesOrderID
) sod
ON sod.SalesOrderID = soh.SalesOrderID

此時我們利用OUTER APPLY則是如下|一段话日记:

USE AdventureWorks2012
GO

SELECT 
    soh.SalesOrderID
    ,soh.OrderDate
    ,sod.max_unit_price
FROM Sales.SalesOrderHeader AS soh
OUTER APPLY
(
    SELECT 
        max_unit_price = MAX(sod.UnitPrice)
    FROM Sales.SalesOrderDetail AS sod
    WHERE soh.SalesOrderID = sod.SalesOrderID
) sod

上述對於APPLY右側表表達式是一個派生表-_|金贵洋,此時為了封裝___女相 陆贞传奇txt,我們可以使用TVF內嵌表值函數來實現_-11选5彩票人工计划软件。其實將內嵌表值函數來代替派生表實現每個客戶最近的3個訂單|--古典舞基本功。首先我們封裝一個表值函數

USE TSQL2012
GO

IF OBJECT_ID('dbo.TopOrders') IS NOT NULL
    DROP FUNCTION dbo.TopOrders;
GO

CREATE FUNCTION dbo.TopOrders
    (@custid  AS INT, @n  AS  INT)
    RETURNS TABLE
AS RETURN

    SELECT  orderid, empid, orderdate, requireddate
    FROM Sales.Orders
    WHERE  custid = @custid
    ORDER BY orderdate DESC, orderid DESC
    OFFSET 0 ROWS FETCH FIRST @n ROWS ONLY;
GO

接著利用CROSS APPLY進行查詢__阿玛拉王国 锻造。

USE TSQL2012
GO

SELECT C.custid, C.companyname, A.orderid, A.empid, A.requireddate
FROM Sales.Customers AS C
 CROSS APPLY dbo.TopOrders(C.custid, 3) AS A;

上麵我們通過封裝內嵌表值函數代替派生表使代碼更具可讀性和可維護性|-北华信集团董事长。到此我們可以得出一點基本結論-|-什么叫波推。

APPLY運算符使用分析結論-|李天一受害老师照片:當需要對表中的每一行進行應用時__亿彩下载,且需要將所有結果集組合到一個結果集表中時|_金华职业技术学院信息工程学院,此時我們應該使用APPLY運算符-|-105彩票手机登录,至於是使用CROSS APPLY還是OUTER APPLY根據場景而定-_|盈彩是什么,雖然APPLY右側表可以用相關子查詢或者派生表來實現___企业发展规划书范文,但是使得代碼臃腫和可維護性差-||卡通战争剑灵中文破解版,通過封裝內嵌表值函數來實現可以說是對右側表通過相關子查詢或者派生表來實現的完美替代者||永盛娱乐是骗局么。

總結

本節我們講解了APPLY運算符中兩種類型的使用|-长治日报电子版,下一節我們來分析下關於CROSS APPLY VS INNER JOIN的性能問題_众博国际怎么样,同時也說明下CROSS APPLY和OUTER APPLY的應用場景--钟舒曼。簡短的內容|--芙蓉树下博客,深入的理解___财经郎眼 余额宝,我們下節再會||-4466k。

延伸閱讀_-_广汉刘勇:

Tag標簽汤唯在韩国视频: 運算符  
  • 專題推薦

  • Windows7係統入門 優化 技巧技術專題
  • Windows7係統專題 無論是升級操作係統|东港宋老六、資料備份-众发彩票官网、加強資料的安全及管...... 詳細
About IT165 - 廣告服務 - 隱私聲明 - 版權申明 - 免責條款 - 網站地圖 - 網友投稿 - 聯係方式
本站內容來自於互聯網,僅供用於網絡技術學習,學習中請遵循相關法律法規
9号彩票运盛彩票天盛彩票快乐飞艇金牌彩票众赢彩票

免责声明: 本站资料及图片来源互联网文章,本网不承担任何由内容信息所引起的争议和法律责任。所有作品版权归原创作者所有,与本站立场无关,如用户分享不慎侵犯了您的权益,请联系我们告知,我们将做删除处理!