偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

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次以上的話,你必然會(huì)用到View或者臨時(shí)表,現(xiàn)在你也可以考慮用CTE了。

CTE的語法相當(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語句,以上述例子加以說明:

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

第二個(gè)子句就沒那么普通了,它被稱為遞歸語句,請(qǐng)注重到在from后面, Employee和DirectReport進(jìn)行了鏈接操作。你一定會(huì)問,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è)程序員,每次看到遞歸的程序,必然會(huì)想到無限遞歸這個(gè)錯(cuò)誤。為了避免了在開發(fā)階段,無限遞歸導(dǎo)致數(shù)據(jù)庫的崩潰,SQL Server提供了一個(gè)QueryHint, MaxRecursion,可以控制遞歸的***層數(shù),假如超過這個(gè)數(shù)字而仍為結(jié)束,則視為代碼錯(cuò)誤,強(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存儲(chǔ)過程的命名標(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-12 10:34:58

SQL Server視

2010-07-19 13:22:45

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-19 17:57:22

SQL Server鎖

2010-07-20 11:18:12

SQL server阻

2009-04-27 15:02:42

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

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