成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

SQL Server CTEs的語法與功能

數(shù)據(jù)庫 SQL Server
我們今天主要向大家講述的是SQL Server CTEs 的遞歸功能,CTEs是SQL Server數(shù)據(jù)庫中的三種保存臨時(shí)結(jié)果的主要操作方法之一。

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

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

CTE的語法相當(dāng)?shù)暮唵? 如下:

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語句,以上述例子加以說明:

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

第二個(gè)子句就沒那么普通了,它被稱為遞歸語句,請注重到在from后面, Employee和DirectReport進(jìn)行了鏈接操作。你一定會問,DirectReport的定義還沒完成,這個(gè)名字代表什么結(jié)果呢?答案是它不只是代表了一個(gè)結(jié)果,實(shí)際上代表了一系列的結(jié)果。換句話說,在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è)過程就結(jié)束了。

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

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

可見SQL Server CTEs可以用來遞歸操作樹形結(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存儲過程的命名標(biāo)準(zhǔn)如何進(jìn)行?
  5.  Server數(shù)據(jù)庫的臨時(shí)表的正確操作步驟
責(zé)任編輯:佚名 來源: 人民郵電出版社
相關(guān)推薦

2010-10-19 14:45:01

SQL SERVER臨

2010-11-11 17:20:51

SQL Server創(chuàng)

2010-11-09 10:10:08

SQL Server

2010-09-27 10:59:23

SQL SERVER事

2011-02-28 17:41:20

SQL Server

2010-11-11 10:18:59

select into

2010-07-19 13:22:45

SQL Server

2010-07-12 10:34:58

SQL Server視

2010-07-05 13:19:36

2010-04-09 10:43:34

Oracle SQL

2009-03-23 09:11:36

SQL Server自SQL Server自SQL Server數(shù)

2010-07-08 15:40:28

SQL Server嵌

2010-07-20 09:15:03

SQL Server

2011-09-07 10:24:01

SQL Server鏡像

2010-07-09 15:39:29

SQL server

2010-07-19 14:24:15

SQL Server盤

2010-07-14 13:21:19

SQL Server

2010-07-20 11:18:12

SQL server阻

2010-07-19 17:57:22

SQL Server鎖

2009-04-27 15:02:42

SQL Server 數(shù)據(jù)庫引擎升級
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 欧美天堂 | 欧美综合久久久 | 国产精品久久久久久久久久久久冷 | 不卡一二三区 | 亚洲精品电影网在线观看 | 精品国产一区二区在线 | 久久精品一区二区 | 久久伊人青青草 | 国产精品久久久久久久 | 欧美videosex性极品hd | 91就要激情 | 97超碰在线播放 | 欧美专区在线 | 成人免费一区二区三区视频网站 | 日韩在线视频一区二区三区 | 美女天天操| 精品一区在线免费观看 | 久色| 亚洲国产精品suv | 亚洲一区免费 | 国产精品久久久久久一区二区三区 | 国产乱码精品一区二区三区中文 | 亚洲精品中文在线观看 | 干干干操操操 | 午夜影院 | 天堂成人av | 欧美日韩视频在线播放 | 久久av网| 日本免费在线 | 久久www免费人成看片高清 | 日韩成人免费视频 | 99亚洲| 操操网站 | 久久亚 | 亚洲精品国产第一综合99久久 | 天天久久 | 欧美一区二区三区在线观看视频 | 亚洲欧美日韩电影 | 欧美jizzhd精品欧美巨大免费 | 色网站入口 | 亚洲激情视频在线 |