日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
SQLServerCTEs的語(yǔ)法與功能

以下的文章主要向大家講述的是SQL Server CTEs 的遞歸功能是SQL Server數(shù)據(jù)庫(kù)中的三種保存臨時(shí)結(jié)果的實(shí)際操作方法之一。其另兩種是臨時(shí)表與View,當(dāng)然你也可以說(shuō)View并不保存數(shù)據(jù),從這一點(diǎn)上來(lái)將, CTE更像View一些。

創(chuàng)新互聯(lián)專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于做網(wǎng)站、成都網(wǎng)站設(shè)計(jì)、三原網(wǎng)絡(luò)推廣、微信小程序定制開發(fā)、三原網(wǎng)絡(luò)營(yíng)銷、三原企業(yè)策劃、三原品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運(yùn)營(yíng)等,從售前售中售后,我們都將竭誠(chéng)為您服務(wù),您的肯定,是我們最大的嘉獎(jiǎng);創(chuàng)新互聯(lián)為所有大學(xué)生創(chuàng)業(yè)者提供三原建站搭建服務(wù),24小時(shí)服務(wù)熱線:18980820575,官方網(wǎng)址:www.cdcxhl.com

當(dāng)你的查詢需要從一個(gè)源表中統(tǒng)計(jì)出結(jié)果,基于這個(gè)結(jié)果再做進(jìn)一步的統(tǒng)計(jì),如此3次以上的話,你必然會(huì)用到View或者臨時(shí)表,現(xiàn)在你也可以考慮用CTE了。

CTE的語(yǔ)法相當(dāng)?shù)暮?jiǎn)單, 如下:

With CTE的名字 AS

(

子查詢

)

Select * from CTE的名字

SQL Server CTEs支持在定義時(shí)引用自身,從而可以達(dá)到遞歸的目的,看下面的例子(1):

 
 
 
  1. ---prepare test data   
  2. SET NOCOUNT ON;   
  3. CREATE TABLE dbo.Parts   
  4. (   
  5. partid INT NOT NULL PRIMARY KEY,   
  6. partname VARCHAR(25) NOT NULL   
  7. );   
  8. INSERT INTO dbo.Parts(partid, partname)   
  9. select 1, 'Black Tea'   
  10. union all select 2, 'White Tea'  
  11. union all select 3, 'Latte'  
  12. union all select 4, 'Espresso'  
  13. CREATE TABLE dbo.BOM   
  14. (   
  15. partid INT NOT NULL REFERENCES dbo.Parts,   
  16. assemblyid INT NULL REFERENCES dbo.Parts,   
  17. unit VARCHAR(3) NOT NULL,   
  18. qty DECIMAL(8, 2) NOT NULL,   
  19. UNIQUE(partid, assemblyid),   
  20. CHECK (partid <> assemblyid)   
  21. );   
  22. INSERT INTO dbo.BOM(partid, assemblyid, unit, qty)   
  23. select 1, NULL, 'EA', 1.00  
  24. union all  
  25. select 2, 1, 'EA', 1.00  
  26. union all  
  27. select 3, 2, 'EA', 1.00  
  28. union all  
  29. select 4, 3, 'EA', 1.00  
  30. -- perform the test   
  31. WITH BOMTC AS(   
  32. SELECT assemblyid, partid   
  33. FROM dbo.BOM   
  34. WHERE assemblyid IS NOT NULL   
  35. UNION ALL   
  36. SELECT P.assemblyid, C.partid   
  37. FROM BOMTC AS P   
  38. JOIN dbo.BOM AS C ON C.assemblyid = P.partid   
  39. )   
  40. SELECT DISTINCT assemblyid, partid FROM BOMTC;   

輸出結(jié)果如下:

例子(2):

 
 
 
  1. create table Employee   
  2. (   
  3. MgrId int,   
  4. EmpId int,   
  5. Title nvarchar(256)   
  6. )   
  7. insert into employee  
  8. select NULL, 1 ,'CEO'   
  9. union all  
  10. select 1, 2, 'VP'   
  11. union all  
  12. select 2, 3, 'Dev Manager'  
  13. union all  
  14. select 2, 4, 'QA Manager'   
  15. union all  
  16. select 1, 5, 'Sales Manager'   
  17. union all  
  18. select 3, 30, 'Developer'   
  19. union all  
  20. select 3, 31, 'Developer'   
  21. union all  
  22. select 4, 40, 'Tester'  
  23. union all   
  24. select 4, 41, 'Tester'   
  25. With DirectReports as   
  26. (   
  27. select MgrId, EmpId, Title, 0 as [Level] from Employee where MgrId is null   
  28. union all   
  29. select a.MgrId, a.EmpId, a.Title, [Level]+1 as [Level]   
  30. from Employee a join DirectReports b on a.MgrId=b.EmpId   
  31. )   
  32. select * from DirectReports   

結(jié)果:

講解:重點(diǎn)是子查詢中的兩個(gè)select語(yǔ)句,以上述例子加以說(shuō)明:

***個(gè)Select子句被稱為錨點(diǎn)語(yǔ)句,它返回的結(jié)果跟普通的SQL沒(méi)有區(qū)別,在這里返回MgrID為null的員工。

第二個(gè)子句就沒(méi)那么普通了,它被稱為遞歸語(yǔ)句,請(qǐng)注重到在from后面, Employee和DirectReport進(jìn)行了鏈接操作。你一定會(huì)問(wèn),DirectReport的定義還沒(méi)完成,這個(gè)名字代表什么結(jié)果呢?答案是它不只是代表了一個(gè)結(jié)果,實(shí)際上代表了一系列的結(jié)果。換句話說(shuō),在DirectReport這個(gè)名字下,包含著DirectReport0,DirectReport1,DirectReport2...這些較小的集合。

DirectReport0 是Employee和錨點(diǎn)結(jié)合的產(chǎn)物;

DirectReport1 是Employee和 DirectReport0 結(jié)合的產(chǎn)物;

依次類推, DirectReport n是Employee和DirectReport n-1結(jié)合的產(chǎn)物;

當(dāng)DirectReport_n為空的時(shí)候,這個(gè)過(guò)程就結(jié)束了。

*** 錨點(diǎn)和DirectReport0,DirectReport1... 的并集就是DirectReport的內(nèi)容。

作為一個(gè)程序員,每次看到遞歸的程序,必然會(huì)想到無(wú)限遞歸這個(gè)錯(cuò)誤。為了避免了在開發(fā)階段,無(wú)限遞歸導(dǎo)致數(shù)據(jù)庫(kù)的崩潰,SQL Server提供了一個(gè)QueryHint, MaxRecursion,可以控制遞歸的***層數(shù),假如超過(guò)這個(gè)數(shù)字而仍為結(jié)束,則視為代碼錯(cuò)誤,強(qiáng)制退出。如:Option(MaxRecursion 10)

可見(jiàn)SQL Server CTEs可以用來(lái)遞歸操作樹形結(jié)構(gòu)的數(shù)據(jù)表。

【編輯推薦】

  1. SQL Server浮點(diǎn)數(shù)據(jù)類型的詳細(xì)解析
  2. 卸載SQL Server 2005組件的正確順序
  3. SQL Server 2000刪除實(shí)戰(zhàn)演習(xí)
  4. SQL Server存儲(chǔ)過(guò)程的命名標(biāo)準(zhǔn)如何進(jìn)行?
  5.  Server數(shù)據(jù)庫(kù)的臨時(shí)表的正確操作步驟

網(wǎng)站題目:SQLServerCTEs的語(yǔ)法與功能
文章位置:http://m.5511xx.com/article/cccgpcj.html